.перенаправление htaccess, если шаблон совпадения больше ничего не делает

#apache #.htaccess #redirect #mod-rewrite

Вопрос:

У меня есть три сценария, которые я должен удовлетворить

Сценарии таковы

  1. Нужно перенаправить, если www.example.com затем на www.example.com/a-a
  2. Нужно перенаправить, если www.example.com/pages затем на www.example.com/a-a/pages
  3. Не нужно перенаправлять, если www.example.com/b-b потом все пойдет как есть www.example.com/b-b
  4. Не нужно перенаправлять, если www.example.com/b-b/pages потом все пойдет как есть www.example.com/b-b/pages

Мой код удовлетворяет первым двум сценариям и заставляет всегда одно и то же. Я не мог привести условие «не».

 RewriteEngine on RewriteCond %{REQUEST_URI} !^/a-a(/.*)?$ RewriteRule ^(.*)$ /a-a/$1 [L,R=301]  RewriteCond %{REQUEST_URI} ^/b-b(/.*)?$ RewriteRule ^(.*)$ [L,R=301] # do nothing here and not to do the previous condition  

Второе условие — всегда заставлять www.example.com/a-a/b-b меня этого не хотеть.

Ответ №1:

Второе правило на самом деле ничего не делает, так как запрос /b-b перехватывается первым правилом. (Второе правило в любом случае недействительно, так как вам не хватает строки подстановки, это приведет к внутренней перезаписи [L,R=301] , которая, скорее всего, «ужасно сломается».)

Тебе не нужно второе правило. Вы можете создать исключение для первого правила с RewriteCond помощью директивы, точно так же, как вы создали исключение для исключения /a-a (и перенаправления на себя).

Например:

 RewriteCond %{REQUEST_URI} !^/b-b(/.*)?$ RewriteCond %{REQUEST_URI} !^/a-a(/.*)?$ RewriteRule ^(.*)$ /a-a/$1 [L,R=301]  

Вам нужно будет очистить кэш вашего браузера перед тестированием, так как ошибочное (301 — постоянное) перенаправление на /a-a/b-b будет кэшировано. Чтобы избежать проблем с кэшированием, протестируйте 302 (временных) перенаправления.

Комментарии:

1. Идеальный ответ, Спасибо @MrWhite. и 302 очень помогли в тестировании.