8

我有一个站点,其中包含一组已放入 CMS 的旧 .html 和 .php 页面。

目前在 .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 在我们的 CMS 中拥有漂亮的 URL,它将采用 形式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 重定向 301 语句未进行匹配时,如何应用重写规则,以便发生以下情况:

http://www.example.com/oldpage1.html-> 重定向到 -> http://www.example.com/newpage1.php-> 被视为 -> http://www.example.com/index.php?page=/newpage1.php

任何提示将不胜感激?谢谢。

4

1 回答 1

12

我在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
于 2011-02-01T17:59:24.437 回答