出于某种原因,我遇到了重写规则的问题,我认为应该很容易。
我想将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]
答案 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]
上进行测试