Использование mod_rewrite и mod_alias (перенаправление 301) вместе в .htaccess?

У меня есть сайт с набором старых страниц .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

Как я могу применить правило перезаписи только в том случае, если операторы перенаправления 301 mod_alias не выполнили совпадение, чтобы произошло следующее:

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

Любые подсказки будут очень признательны? Спасибо.


person Nick Evans    schedule 31.01.2011    source источник


Ответы (1)


Я нашел ответ в отличном объяснении 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
person Nick Evans    schedule 01.02.2011