【问题标题】:PHP replacing first ? in querystring with & symbolPHP先替换?在带有 & 符号的查询字符串中
【发布时间】: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


【解决方案1】:

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

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

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

有了这个你会得到:

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

【讨论】:

  • 几乎有效。但是,即使没有查询字符串,它也会添加尾随问号。例如,l.sitename.com/ThisHasNoQuestion - $_SERVER["QUERY_STRING"] = "ThisHasNoQuestion?"。如果查询字符串为空,如何省略问号?
  • 抱歉打扰了,但这并没有按预期工作。示例 URL:l.example.com/asdf?1234 结果:502 代理错误 代理服务器收到来自上游服务器的无效响应。代理服务器无法处理请求 GET /asdf。原因:DNS 查找失败:access_log 条目:“GET /asdf?1234 HTTP/1.1”502 379 不知何故,“link.php”部分被完全忽略了。如果我省略问号而只使用:l.example.com/asdf 谢谢!
  • 对不起,它没有显示任何换行符。 access_log 应该在新的一行。
  • 万岁!有用!我不知道 RewriteCond 行的顺序很重要。为什么这个特定的顺序有什么不同?
  • 其实我并不完全确定,但我猜RewriteCond 捕获的组只能在RewriteRule 最接近的条件下工作。
猜你喜欢
  • 2014-11-22
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 2013-11-05
相关资源
最近更新 更多