重写规则以迁移停留在同一域上的网站代码

时间:2012-07-14 10:44:26

标签: apache mod-rewrite

我在.htaccess文件中有这个

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

我要做的是在此配置中添加另一个RewriteRule,以便将这些旧网址重定向到网站的根目录

http://www.acme.com/category.php?id=6
http://www.acme.com/product.php?id=183&category= 

我知道“category.php”和“product.php”现在是无效的字符串。以“category.php”为例,我尝试将配置改为此

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^category.php(.*) / [L,R=301]
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

这将重定向如下

http://www.acme.com/category.php?id=112 -> http://www.acme.com/?id=112

我有两个问题

  1. 我不希望追加查询字符串。我没有说明 [QSA]
  2. 如果我直接输入根www.acme.com,则不会显示该页面 除非我删除刚才添加的行。为什么我的新RewriteRule 影响不以“category.php”开头的网址?
  3. [编辑]

    我也试过这个,而不是上面的重定向,但我似乎仍然正在应用这两个规则

    RewriteRule ^category.php /holdingPage.php [L]
    

1 个答案:

答案 0 :(得分:1)

您需要将2个条件绑定到通过index.php发送所有内容的旧规则,并且您需要在上面添加新规则

RewriteEngine On
RewriteBase /

RewriteRule ^category.php /? [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

要处理 1。,我在规则目标中的/的末尾添加了“”。这使得查询字符串不会自动附加,除非你特别拥有QSA标志。至于 2。,不确定它为什么不适合你,但它可能与应用于错误规则的2个条件有关。


编辑:

有关2 RewriteCond行的说明,请参阅此帖子:https://stackoverflow.com/a/11275339/851273

RewriteCond本质上是一个条件,这个块:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

本质上是这个(伪代码):

if(request_uri != maps_to_existing file) {
    if(request_uri != maps_to_existing_directory) {
        request_uri = request_uri.replace("([^?]*)", "index.php?_route_=$1", "[L,QSA]");
    }
}

问题是,RewriteCond或其中许多是一个接一个地,只适用于紧随其后的RewriteRule,因此不需要在前面移动category.php规则,伪模式相当于:

if(request_uri != maps_to_existing file) {
    if(request_uri != maps_to_existing_directory) {
        request_uri = request_uri.replace("^category.php", "/?", "[L,R=301]");
    }
}
request_uri = request_uri.replace("([^?]*)", "index.php?_route_=$1", "[L,QSA]");

由于2 if()条件被错误应用,因此被破坏了。特别是重写为“index.php”的那种需要条件,以防止自身循环。