Используя mod_rewrite и mod_alias (перенаправление 301) вместе в .htaccess? - PullRequest
8 голосов
/ 01 февраля 2011

У меня есть сайт с набором старых страниц .html и .php, которые были помещены в CMS.

В настоящее время в файле .htaccess имеется около 30 перенаправлений mod_alias в следующей форме:

redirect 301 /oldpage1.html http://www.example.com/newpage1.php
redirect 301 /oldpage2.php http://www.example.com/newpage2.php
redirect 301 /oldpage3.php http://www.example.com/newpage3.php

Но мы хотим использовать mod_rewrite, чтобы иметь красивые URL-адреса в нашей CMS, которые примут форму http://www.example.com/pagename.php, поэтому также имеем следующее:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?page=$1

На данный момент обаприменяются вместе, что приводит к:

http://www.example.com/newpage1.php?page=oldpage1.html

Как применить правило перезаписи только в том случае, если не найдено совпадений с инструкциями mod_alias redirect 301, так что происходит следующее:

http://www.example.com/oldpage1.html -> перенаправляет на -> http://www.example.com/newpage1.php -> который рассматривается как -> http://www.example.com/index.php?page=/newpage1.php

Любые советы будут очень цениться?Благодаря.

1 Ответ

11 голосов
/ 01 февраля 2011

Я нашел ответ в отличном объяснении mod_rewrite и mod_alias

Проблема в том, что mod_rewrite всегда происходит до mod_alias, независимо от порядка, в котором они размещены в .htaccess.Это обратный порядок, необходимый для этой ситуации.

Хитрость заключается в том, чтобы использовать RewriteRule [R=301] вместо redirect 301 и, следовательно, использовать mod_rewrite для всего, вместо того, чтобы смешивать его с mod_alias.

Полное решение выглядит следующим образом:

RewriteEngine on
RewriteBase /

RewriteRule ^oldpage1.html /newpage1.php [R=301,L]
RewriteRule ^oldpage2.php /newpage2.php [R=301,L]
RewriteRule ^oldpage3.php /newpage3.php [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?page=$1
...