带有问号和&符号的mod_rewrite(使用PHP)

时间:2010-05-16 01:29:22

标签: php mod-rewrite query-string

我有一个基于PHP的网络应用程序,我正在尝试将Apache的mod_rewrite应用到。

原始网址的格式如下:
  http://example.com/index.php?page=home&x=5

我想把它们变成:
  http://example.com/home?x=5

请注意,在重写页面名称时,我也有效地“移动”了问号。当我尝试这样做时,Apache愉快地执行这个翻译:

RewriteRule ^/([a-z]+)\?(.+)$ /index.php?page=$1&$2  [NC,L]

但它弄乱了PHP中的$_GET变量。例如,对http://example.com/home?x=88的调用只会产生一个$_GET变量(page => home)。 x => 88去了哪里?但是,当我将规则更改为使用&符号而不是问号时:

RewriteRule ^/([a-z]+)&(.+)$ /index.php?page=$1&$2  [NC,L]

http://example.com/home&x=88这样的调用会像我期望的那样工作(即pagex $ _GET变量都设置得恰当。)

我知道差异很小,但是如果可能的话,我希望我的URL变量以“问号”“开始”。我确信这反映了我自己对mod_rewrite重定向如何与PHP交互的误解,但似乎我应该能够做到这一点(以这种或那种方式)。

提前致谢!
干杯,
-Chris

1 个答案:

答案 0 :(得分:7)

试试这个:。

RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule ^/([a-z]+)(?:$|\?(?:.+)) /index.php?page=$1 [NC,L,B,QSA,NE]

B转义反向引用(不应该是必要的,因为它匹配[a-z] +,但是如果你想稍后扩展它,它可能会有用)。

编辑:添加了RewriteCond。 编辑2:QSA负责添加&符号。