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

Chr*_*son 4 php mod-rewrite query-string

我有一个基于PHP的Web应用程序,我正在尝试将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]
Run Code Online (Sandbox Code Playgroud)

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

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

一个类似的调用就像http://example.com/home&x=88我期望的那样工作(即pagex_GET变量都设置得恰当).

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

提前致谢!
干杯,
-Chris

Art*_*cto 7

试试这个:.

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

B逃避反向引用(不应该是必要的,因为它匹配[az] +,但是如果你想稍后扩展它,它可能是有用的).

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

  • 重要的标志是QSA(查询字符串追加); 它将原始请求的查询字符串(后面的部分)附加到重写的请求.它还需要添加&或?取决于重写的url是否已经有查询字符串.NE在这里并不是必需的,但它可以防止转义重写的URL.如果添加/index.php?page=$1,$2,它会很有用; NE阻止逗号变为%2C (2认同)