mod重写规则不传递键值

时间:2015-09-08 21:11:41

标签: php apache .htaccess mod-rewrite

我有一些不同的mod-rewrite规则可以工作,但最后一个拒绝将3个参数传递给我的脚本(index.php)

我确实得到p=value,但idridchk变量甚至没有定义......

网址可能如下所示。 。 。

http://www.domain.com/pagename.htm?id=29&rid=174&chk=a9cdca614135bbef2fb1f2bedf171f61

规则......

RewriteRule ^/pagename\.htm\?id\=([0-9]+)&rid\=([0-9]+)&chk\=([a-f0-9]{32})$ /index.php?p=pagename&id=$1&rid=$2&chk=$3 [L]

print_r($_REQUEST);

的输出
Array ( [p] => pagename )

我根本无法理解为什么这不起作用..

1 个答案:

答案 0 :(得分:1)

像@MarcB所说,重写规则不包含查询字符串,你必须使用RewriteCond来检查它。根据您上面的例子,这是适合您的:

RewriteCond %{QUERY_STRING} ^id=([0-9]+)&rid=([0-9]+)&chk=([a-f0-9]{32})$
RewriteRule ^pagename.htm index.php?p=pagename&id=%1&rid=%2&chk=%3 [L]

或者就像我上面所说,您也可以使用QSA标志,如:

RewriteRule ^(pagename).html index.php?p=$1 [L,QSA]

这会将任何附加的查询字符串附加到index.php,但不会对其进行验证(这应该不会在mod_rewrite中完成)。它还允许您添加其他参数,不需要更改规则以适应它们,并且如果键/值的顺序或大小不同,则不会中断。注意:我在pagename周围添加了括号,并在重写的网址中使用了匹配$1。这样更容易更改多个规则的页面名称,因为您不必在两个地方更改它。