Используя mod_rewrite и mod_alias (перенаправление 301) вместе в .htaccess?
-
27-10-2019 - |
Вопрос
У меня есть сайт с набором старых страниц .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