简单的Apache重写问题传递变量

时间:2017-02-28 20:31:05

标签: php apache url-rewriting

出于某种原因,我遇到了重写规则的问题,我认为应该很容易。

我想将site.com/page.html?1重写为site.com/page.php?p=1 和site.com/page.html到site.com/page.php

这是我认为应该工作的,但不是:

RewriteRule page.html?([^/\.]+)/?$ page.php?p=$1 [L,QSA]

2 个答案:

答案 0 :(得分:2)

查询字符串(?后面的URL部分)不包含在RewriteRule的正则表达式部分中。只是请求的页面路径/名称。如果要捕获查询字符串,则需要使用RewriteCond并捕获%{QUERY_STRING}环境变量。像这样:

RewriteCond %{QUERY_STRING} (\d*)
RewriteRule page.html page.php?p=%1 [L,QSA]

注意,我现在捕获RewriteCond中的查询字符串,从?...中的正则表达式末尾删除了尾随RewriteRule,并且还使用{{更改了替换中的变量1}}而不是%1来引用捕获的条件而不是规则。您还可以在条件中更改正则表达式以更好地匹配您想要的内容。

编辑:另外,请记住,QSA会附加重写URL中尚未存在的任何查询字符串。因此,如果您将其保留在那里,如果您传递的查询字符串为$1,则仍会在?1的网址中附加一个带有空值的关键字1 =&gt ; ?1)。如果您不需要额外的查询字符串值,只需删除QSA或者如果您想要额外的值而不关心空白查询字符串参数(除非您循环遍历所有$ _GET,否则不会受到伤害),然后保留它在那里。

答案 1 :(得分:-1)

如果p的值始终为整数,请尝试:

RewriteRule page\.html\?([\d]+)$ page.php?p=$1 [L,QSA]

https://regex101.com/r/3AFu0A/1

上进行测试