【发布时间】:2015-07-28 01:10:30
【问题描述】:
(在 CentOS 6、PHP 5.3.3、httpd 版本 2.2.15 上运行的 LAMP 堆栈)
我正在尝试将整个查询字符串传递给我的 PHP 脚本,但如果查询字符串包含任何问号字符,第一个 ?字符被替换为 & 字符。
在 access_log 中,会显示正确的查询字符串,包括问号。
但是,如果我回显 $_SERVER['QUERY_STRING'] 全局变量,第一个 ?被替换。所以我假设翻译/规范化发生在 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?$1 [NC,L,P,QSA]
最奇怪的事情:它是工作的,但现在它不是在安装更新(CentOS、HTTPD、PHP 等)之后。
感谢您的指点!
【问题讨论】:
-
为什么
/IsThis?thequerystring?作为一个例子,甚至是你认为有效的URI? URI 中应该只有一个?不是 URL 编码的。 -
@mike 我希望人们能够手动将完整的 URL 传递到此页面。例如l.example.com/http://…
-
那么这些 URL 应该是 URL 编码的。如果这样做,您的问题就会消失,并且您可以正确使用 SQA 标志,如果您想将自己的参数添加到在重写之前已经传递了某些参数的情况下,您应该可以这样做。
-
如何对手动输入的 URL 进行 URL 编码?我希望用户在地址栏中键入 url 而无需填写表格。您可以在.htaccess 中对手动输入的网址进行网址编码吗?再次注意,他们将直接输入/粘贴 url 到地址栏中,没有对其进行预处理,我们需要捕获他们扔给它的任何内容。谢谢。
-
好的。这是一个奇怪的用例,通常在谈论传递参数时,您不会期望有人手动将它们输入到地址栏中。
标签: php apache .htaccess mod-rewrite query-string