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

Php 简单Apache重写问题传递变量,php,apache,url-rewriting,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] 如果p的值始终为整数,请尝试: RewriteRule page\.html\?([\d]+)$ page.php?

出于某种原因,我对重写规则有一个问题,我认为这应该很容易

我想将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]
如果p的值始终为整数,请尝试:

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

在URL的查询字符串部分测试?不包括在重写规则的正则表达式部分中。仅显示请求的页面路径/名称。如果要捕获查询字符串,需要使用RewriteCond并捕获%{query_string}环境变量。大概是这样的:

RewriteCond %{QUERY_STRING} (\d*)
RewriteRule page.html page.php?p=%1 [L,QSA]
注意,我现在在RewriteCond中捕获了查询字符串,删除了尾随的?。。。从RewriteRule中正则表达式的结尾,并将替换中的变量更改为%1而不是$1,以引用捕获的条件而不是规则。您还可以在条件中更改正则表达式,以更好地匹配所需内容


编辑:另外,请记住,QSA将附加任何未出现在重写URL中的查询字符串。因此,如果您将其保留在那里,如果您传递一个查询字符串,如?1,您仍然会得到一个附加到URL 1的键,其值为空?1=>array1=>。如果您不需要额外的查询字符串值,只需删除QSA,或者如果您想要额外的值,并且不关心空的查询字符串参数,除非您在所有$\u GET上循环,否则将其保留在那里。

当正则表达式与查询字符串匹配时,正则表达式不包括查询字符串以匹配重写规则。只需查询字符串之前(但不包括)请求的URI名称/路径。然后检查并确保设置了p,并且p不为空,因为这将始终设置$\u GET['p']。我个人使用了以下命令:ifisset$\u GET['p']&&!empty$_GET['p']@Kaboom您还可以将条件中的正则表达式模式更改为类似于\d+的形式,以要求至少一个数字,或者使用锚或类似的方式,根据需要更改需要值的其他模式。如果条件模式失败,将跳过RewriteRule,这意味着如果没有匹配的规则,将生成404错误页面,该页面不存在为*.html,并且可以加载apache ErrorDocument来处理该错误。我只是把模式做得很宽,这样就可以加载所需的*.php页面了。谢谢,这很好用。我遇到的唯一问题是变量是字符串而不是数字。例如,如果我试图通过site.com/page.html?测试,它将不会通过。但是,如果我通过site.com/page.html?123,它就没有权限了。有没有办法让两者都发挥作用?谢谢我在条件中使用的模式是\d+。这基本上可以是任何模式,就像其他模式一样。所以你可以简单地说,+来捕捉任何东西,或者更严格一点[a-zA-Z0-9]+来捕捉任何一块字母/数字,没有空格、斜杠、符号等。