правильный порядок правил перезаписи в файле htaccess - PullRequest
1 голос
/ 10 июля 2009

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

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), я думаю. Я думаю, что порядок моих правил должен быть неправильным, но я не могу понять, как это правильно. Может Вы помогаете?

Ответы [ 2 ]

3 голосов
/ 10 июля 2009

«Правило 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]
0 голосов
/ 10 июля 2009

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

Так что я не буду менять ваш текущий порядок.

...