我在.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
我有两个问题
www.acme.com
,则不会显示该页面
除非我删除刚才添加的行。为什么我的新RewriteRule
影响不以“category.php”开头的网址?[编辑]
我也试过这个,而不是上面的重定向,但我似乎仍然正在应用这两个规则
RewriteRule ^category.php /holdingPage.php [L]
答案 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”的那种需要条件,以防止自身循环。