правильный порядок перезаписи правил в файле htaccess
-
12-09-2019 - |
Вопрос
Мне нужно иметь :
http://www.example.com/v1/my-project/ перенаправлено на http://example.com/my-project/
итак :
(1) удалите www с http_host
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
(2) удалите часть 'v1/' из request_uri
RewriteCond %{REQUEST_URI} ^/v1/(.*)$ [NC]
RewriteRule . %1 [R=301,L]
(3) Я также хочу перенаправить все 404 на домашнюю страницу.
ErrorDocument 404 /
(4) Наконец, все мои документы фактически находятся в папке "v2 /", в которой размещен текущий активный веб-сайт, но я не хочу, чтобы "v2" в URL, просто "/"
RewriteCond %{REQUEST_URI} !^/v2/ [NC]
RewriteRule ^(.*)$ /v2/$1 [NC,L]
Итак, вот мои правила.Мой вопрос заключается в следующем:я не справляюсь (2):он перенаправляется на / (я думаю, из-за правила (3).Я думаю, что порядок моих правил, должно быть, ошибочен, но, похоже, я не могу сделать это правильно.Вы можете помочь ?
Решение
"Правило 3" вообще не является правилом, и его порядок относительно ваших правил перезаписи не имеет значения.Правило 2 терпит неудачу по какой-то другой причине.Я не уверен, решит ли это вашу проблему, но я бы несколько упростил ваши правила, написав их следующим образом:
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule (.*) http://example.com/$1 [R=301,L]
RewriteRule ^v1/(.*) /$1 [R=301,L,NC]
RewriteCond %{REQUEST_URI} !^/v2/ [NC]
RewriteRule (.*) /v2/$1 [NC,L]
Другие советы
Сначала вы должны написать любое правило, которое вызывает внешнее перенаправление (R
флаг), а затем другие правила.В противном случае уже переписанный URL-адрес может быть использован для внешнего перенаправления, хотя он был предназначен только для внутреннего перенаправления.
Поэтому я не буду менять порядок, который у вас есть прямо сейчас.