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

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

http://www.example.com/v1/my-project/ перенаправлено на http://example.com/my-project/

so :

(1) удалить www из http_host

RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

(2) удалить часть 'v1/' запроса_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), я думаю. Я думаю, что порядок моих правил должен быть ошибочным, но я не могу понять это правильно. Может ты помогаешь ?


person pixeline    schedule 10.07.2009    source источник


Ответы (2)


«Правило 3» вообще не является правилом, и его порядок относительно ваших RewriteRules не имеет значения. Правило 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]
person chaos    schedule 10.07.2009

Сначала вы должны написать любое правило, вызывающее внешнее перенаправление (флаг R), а затем другие правила. В противном случае уже переписанный URL-адрес можно использовать для внешнего перенаправления, хотя он только что предназначался для внутреннего перенаправления.

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

person Gumbo    schedule 10.07.2009