#apache #.htaccess #redirect #mod-rewrite
Вопрос:
У меня есть три сценария, которые я должен удовлетворить
Сценарии таковы
- Нужно перенаправить, если
www.example.com
затем наwww.example.com/a-a
- Нужно перенаправить, если
www.example.com/pages
затем наwww.example.com/a-a/pages
- Не нужно перенаправлять, если
www.example.com/b-b
потом все пойдет как естьwww.example.com/b-b
- Не нужно перенаправлять, если
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 очень помогли в тестировании.