правильный порядок перезаписи правил в файле htaccess

StackOverflow https://stackoverflow.com/questions/1108995

Вопрос

Мне нужно иметь :

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-адрес может быть использован для внешнего перенаправления, хотя он был предназначен только для внутреннего перенаправления.

Поэтому я не буду менять порядок, который у вас есть прямо сейчас.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top