Apache RewriteRules不起作用,但在使用其他正则expression式工具进行testing时工作?

我有这个规则:

RewriteEngine On RewriteRule ^/page/([a-zA-Z0-9]+)\?(.*)$ /index.php?page=$1&$2 

它应该采取这样的事情:

 /page/contact?cake=lie 

并转到页面:

 /index.php?page=contact&cake=lie 

我已经用RegExr和RegexPal等工具testing过了,它在那里工作。 但是当把它放入Apachesconfiguration,访问url给Apaches 404页面。

谁能帮忙?

如果您想逐字传递现有的查询string,mod_rewrite会为此提供QSA标志 。 使用它,您的规则集可以简化为以下内容:

 RewriteEngine On RewriteRule ^/page/([a-zA-Z0-9]+)$ /index.php?page=$1 [QSA] 

然后,mod_rewrite会自动附加任何现有的查询string到您通过replace添加的string。 其结果与Steven Monai的方法实际上是一样的 ,但是我觉得这个方法有点干净。

默认情况下,mod_write与REQUEST_URI匹配,REQUEST_URI只包含URI而不包含dynamic参数,所以它会在问号后丢弃所有的东西。

要匹配完整的URI,您需要使用THE_REQUEST(或者如果有另一种方法,请赐教!)。 请注意,它包含客户端发送的完整请求,例如“GET / foo?bar = baz HTTP / 1.1”。

尝试类似

 RewriteCond %{THE_REQUEST} ^(.*)$ RewriteRule ^GET /page/([a-zA-Z0-9]+)\?(.*) HTTP.*$ /index.php?page=$1&$2 

你有重写引擎打开?

 RewriteEngine On 

Janne对你的规则不起作用的评估是正确的。 但是我会采取一个较为复杂的方法来解决这个问题:

 RewriteRule ^/page/([a-zA-Z0-9]+)$ /index.php?page=$1&%{QUERY_STRING} 

当Apache已经在%{QUERY_STRING}给你提供查询string时,不需要分开原始请求。

这里logging了通过%{VARNAME}语法提供给您的服务器variables列表。