PHP中的基本URL重写问题(mod_rewrite)

时间:2009-11-11 19:16:11

标签: php url mod-rewrite url-rewriting

在我的.htaccess中,我有以下

RewriteEngine On

RewriteRule ^users/?$   users.php
RewriteRule ^users/([a-z]+)/?$   users.php?username=$1

如果我这样做,一切都按预期工作

http://example.com/users/
http://example.com/users/joeschmoe/

并且PHP将读取“joeschmoe”作为

的值
 $_GET['username']

然而,如果我这样做

http://example.com/users/joeschmoe/?foo

PHP不会拿起

 $_GET['foo']

知道为什么会这样,以及如何让它发挥作用?谢谢你的时间!

2 个答案:

答案 0 :(得分:6)

[QSA]选项添加到RewriteRule,这将使apache能够将查询字符串附加到重定向的网址:

RewriteRule ^users/?$   users.php [QSA]
RewriteRule ^users/([a-z]+)/?$   users.php?username=$1 [QSA]

答案 1 :(得分:4)

您可能正在寻找RewriteRule的“QSA”选项:

  

'qsappend|QSA'(查询字符串追加)   
这个标志强制重写   引擎附加查询字符串部分   取代字符串的   现有的字符串,而不是替换   它。如果要添加更多内容,请使用此选项   通过重写将数据写入查询字符串   规则。

该页面还指出:

  

修改查询字符串

     

默认情况下,传递查询字符串   通过不变。你可以,   但是,在。中创建URL   包含查询的替换字符串   字符串部分。只需使用一个问题   在替换字符串中标记为   表明以下文字   应该重新注入查询   串。
当你想要擦除   现有的查询字符串,结束   替换字符串只有一个   问号。
结合新的   和旧的查询字符串,使用[QSA]   标志


在你的情况下,这样的事情应该做:

RewriteEngine On

RewriteRule ^users/?$   users.php
RewriteRule ^users/([a-z]+)/?$   users.php?username=$1 [QSA]