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

Posted

技术标签:

【中文标题】mod_rewrite 带问号和 & 符号(使用 PHP)【英文标题】:mod_rewrite with question marks and ampersands (with PHP) 【发布时间】:2011-02-20 00:01:47 【问题描述】:

我有一个基于 php 的 Web 应用程序,我正在尝试将 Apache 的 mod_rewrite 应用到该应用程序。

原始 URL 的格式为: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 交互的误解,但似乎我应该能够做到这一点(一种或另一种方式)。

提前致谢! 干杯, -克里斯

【问题讨论】:

查询字符串应始终以问号开头,而不是与号。 【参考方案1】:

试试这个:。

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

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

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

【讨论】:

谢谢 - 就像一个魅力 - 但你能解释一下原因吗?我不是 PCRE 的新手(您的正则表达式完全可以理解),但是它如何产生预期结果的语义让我感到困惑。 我想,具体来说,为什么 RewriteCond 是必要的?另外,如果没有捕获子模式,QSA 有什么帮助? 重要的标志是 QSA(查询字符串追加);它将原始请求的查询字符串(?之后的部分)附加到重写的请求中。它还需要添加 & 或 ?取决于重写的 url 是否已经有查询字符串。 NE 在这里并不是必需的,但它可以防止转义重写的 URL。如果添加 /index.php?page=$1,$2; 会很有用NE 防止逗号变成 %2C RewriteCond 不是必需的。但是,如果您删除 L 标志或强制 HTTP 转发并允许捕获的组包含点,您可能会发现自己处于无限循环中。所以请随意删除它。

以上是关于mod_rewrite 带问号和 & 符号(使用 PHP)的主要内容,如果未能解决你的问题,请参考以下文章

浏览中文网页,字体显示好多问号和菱形,怎么解决?

URL 链接中 井号#问号?连接符& 分别有什么作用?

URL 链接中 井号#问号?连接符& 分别有什么作用?

URL 链接中 井号#问号?连接符& 分别有什么作用?

URL 链接中 井号#问号?连接符& 分别有什么作用?

PHP Mod_rewrite 和 URL 编码符号 - 只能使用其中一个,但不能同时使用?