这是我的规则:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^domain.com
RewriteRule ^index\.php?(.*)$ http://www.domain.com/$1 [R=301,L]
我的输入网址为http://domain.com/test
,但在我预期http://www.domain.com/?/test
时,浏览器会重定向到http://www.domain.com/test
。 Tested here
我的想法是重定向到www.
,但问题是我正在使用重写为index.php?$1
的自定义框架。
答案 0 :(得分:1)
请参阅下面的更新。
您的问题可能是?
是正则表达式元字符(例如.
和*
):
?
表示前一个表达式中的零个或一个。 “pin?e”将匹配“pine”和“pie”。 source
尝试像这样逃避它:
RewriteRule ^index\.php\?(.*)$ http://www.domain.com/$1 [R=301,L]
您现有的规则正在寻找index.ph
,可能后跟p
,然后将所有剩余字符收集到$1
(其中包含?
)。
<强>更新强>
经过审核,我在这里犯了一些非常基本的错误。请允许我纠正它们:
mod_rewrite
仅查看URL的路径部分...这意味着所有内容都包括但不包括?
将查询字符串与路径分开。因此,我上面列出的规则永远不会有效,因为?
无法看到RewriteRule
及后续文字。
你可以与RewriteCond
指令匹配查询字符串,这给了我们:
RewriteCond %{QUERY_STRING} (.*)
RewriteRule ^/index.php http://www.domain.com/%1 [R=301,L]
这会将查询字符串中的所有内容转储到%1
,然后将其附加到http://www.domain.com/
...这几乎可以正常工作,但您会发现这样的请求:
http://domain.com/index.php?some/path
变为:
http://www.domain.com/some/path?some/path
我们需要在重写的路径中加入?
,告诉mod_rewrite
删除查询字符串,这样就可以了:
RewriteCond %{QUERY_STRING} (.*)
RewriteRule ^/index.php http://www.domain.com/%1? [R=301,L]
在我的系统上使用此配置,请求:
http://localhost/index.php?some/path
返回:
HTTP/1.1 301 Moved Permanently
Date: Sat, 31 Mar 2012 00:39:34 GMT
Server: Apache/2.4.1 (Unix) OpenSSL/1.0.0g-fips mod_macro/1.2.1
Location: http://www.domain.com/some/path