2017-02-28 37 views
0

由于某种原因,我遇到了一个我认为应该很容易的重写规则问题。简单的Apache重写问题传递变量

我想重写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

查询字符串(在?之后的部分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的URL后附加一个带有空值的密钥(?1 =>array(1=>''))。如果你不需要额外的查询字符串值,只需删除QSA,或者如果你想要额外的值并且不关心空白的查询字符串参数(除非你循环遍历所有的$ _GET),那么保留它在那里。

+0

然后检查并确保'p'设置为**,**'p'不为空,因为这将始终具有设置​​的$ _GET ['p']'。我个人使用了下面的代码: 'if(isset($ _ GET ['p'])&&!empty($ _ GET ['p']))' – Kaboom

+0

@Kaboom您也可以将条件中的正则表达式更改为类似'(\ d +)'需要至少一个数字或其他某种需要使用锚点或类似物的值。如果条件模式失败,则会跳过RewriteRule,这意味着如果没有要匹配的规则,则会生成404错误(页面不存在为* .html),并且可以加载apache ErrorDocument来处理该错误。我只是把这个模式做得很宽泛,所以它会加载所需的'* .php'页面。 –

+0

谢谢,这个作品很棒。我遇到的唯一问题是变量是字符串而不是数字。 例如,如果我尝试通过site.com/page.html?test它不会通过它。但是,如果我通过site.com/page.html?123它没有proplem。 有没有办法让这两个功能? 谢谢 – bakingsoda

-1

如果p值始终是一个整数,尝试:

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

测试在https://regex101.com/r/3AFu0A/1

+0

尽管正则表达式匹配查询字符串,但查询字符串不包含在正则表达式中以匹配“重写规则”。只是请求的URI名称/路径直到但不包括查询字符串。 –