我有一个基于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
这样的调用会像我期望的那样工作(即page
和x
$ _GET变量都设置得恰当。)
我知道差异很小,但是如果可能的话,我希望我的URL变量以“问号”“开始”。我确信这反映了我自己对mod_rewrite重定向如何与PHP交互的误解,但似乎我应该能够做到这一点(以这种或那种方式)。
提前致谢!
干杯,
-Chris
答案 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负责添加&符号。