Mod重写?包括在内

时间:2012-03-30 17:56:39

标签: apache mod-rewrite

这是我的规则:

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/testTested here

我的想法是重定向到www.,但问题是我正在使用重写为index.php?$1的自定义框架。

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