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

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

Вопрос

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

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

Это было полезно?

Решение

Я нашел ответ в Отличное объяснение 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top