PHP 先替换?在带有 & 符号的查询字符串中

PHP replacing first ? in querystring with & symbol

(LAMP Stack 运行 on CentOS 6, PHP 5.3.3, httpd version 2.2.15)

我试图将整个查询字符串传递给我的 PHP 脚本,但是如果查询字符串包含任何问号字符,第一个 ?字符被替换为 & 字符。

在 access_log 中,显示了正确的查询字符串,包括问号。

但是,如果我回显 $_SERVER['QUERY_STRING'] 全局,第一个 ?被替换。所以我假设 translation/normalization 发生在 PHP.

的某个地方

例如:http://l.sitename.com/IsThis?thequerystring?

我们预计 $_SERVER['QUERY_STRING'] 为 "IsThis?thequerystring?" 但相反,它实际上是 "IsThis&thequerystring?"

这是 access_log 条目:

"GET /IsThis?thequerystring? HTTP/1.1" 200 43 "-"

这是 .htaccess 条目:

RewriteCond %{HTTP_HOST} ^l\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/link.php?    [NC,L,P,QSA]

最奇怪的事情:它 曾经 工作,但现在在安装更新(CentOS、HTTPD、PHP 等)后它不工作了。

感谢指点!

删除 QSA 标志,否则 ? 将转换为 ?:

RewriteCond %{QUERY_STRING} ^$
RewriteCond %{HTTP_HOST} ^l\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/user.php? [L,P]

RewriteCond %{QUERY_STRING} .+
RewriteCond %{HTTP_HOST} ^l\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/user.php??%{QUERY_STRING} [L,P]

有了这个你将得到:

$_SERVER["QUERY_STRING"] = IsThis?thequerystring?