部署到 5.2.4 后 PHP 脚本未解码 $_REQUEST[] 中的 URL 参数(存在 %20 个值)

Posted

技术标签:

【中文标题】部署到 5.2.4 后 PHP 脚本未解码 $_REQUEST[] 中的 URL 参数(存在 %20 个值)【英文标题】:PHP script not decoding URL parameters in $_REQUEST[] (%20 values present) after deploying to 5.2.4 【发布时间】:2011-03-19 02:29:17 【问题描述】:

我开发了一个使用 $_REQUEST[] 超全局的 php 脚本。典型的客户端请求可能包括:

http://host.name/socnet/add.php?shortid=1&author=NewUser2&comment=Dad%20dad%20dad

这个 URL 在我的生产环境中被 Apache 改写为等效的 https:// URL,根据以下重写规则:

RewriteRule ^socnet/add.php(.*) https://%SERVER_NAME/socnet/add.php$1 [R,L]

虽然使用 PHP 5.3.2 进行开发并使用 NetBeans 进行调试,但一切正常$_REQUEST['comment']="Dad dad dad"

但是,当我部署到运行 PHP 5.2.4 并执行上述 URL 重写的 VPS 主机环境时 $_REQUEST['comment']="Dad%20dad%20dad"...

所以看起来$_REQUEST['comment'] 没有按照 5.2.4 和我的重写规则对 url 进行解码

任何关于为什么会发生这种情况的想法和合理的解决方法将不胜感激。它是与 PHP 版本相关的问题还是更微妙的问题?有兴趣了解在部署之前遇到此问题的任何人以及他们如何解决此问题。

【问题讨论】:

修复了我添加 [NE] 无转义选项。请参阅 issue.apache.org/bugzilla/show_bug.cgi?id=34602 上的评论 (5)。 所以重写规则变成RewriteRule ^socnet/add.php https://%SERVER_NAME/socnet/add.php [R,L,QSA,NE] 【参考方案1】:

我怀疑 mod_rewrite 正在对其进行编码,导致它被编码两次。我没有尝试过,但不是匹配 (.*),而是尝试将 [R,L] 更改为 [R,L,QSA]QSA 代表查询字符串附加。

编辑

landstatic自己找到的正确选项是NE,代表不转义。

【讨论】:

嗨,我尝试将重写规则更改为:RewriteRule ^socnet/add.php https://%SERVER_NAME/socnet/add.php [R,L,QSA] 但可惜,NetBeans 中的快速测试显示:$_REQUEST['comment'] = Dad%20dad%20dad 修复了我添加 [NE] 无转义选项。见issues.apache.org/bugzilla/show_bug.cgi?id=34602上的评论(5) 我在回答中添加了注释。 ;) 我刚刚遇到了同样的问题——我添加了一个重定向规则来删除www.,然后一段时间后开始看到仍然编码的 url 字符到达我的服务器的结果。似乎它被逃脱了两次,但我无法弄清楚它发生在哪里。添加 NE 标志修复它,谢谢!

以上是关于部署到 5.2.4 后 PHP 脚本未解码 $_REQUEST[] 中的 URL 参数(存在 %20 个值)的主要内容,如果未能解决你的问题,请参考以下文章

部署后脚本中 :r 引用的脚本显示错误

警告:更新到 PHP 7.2 后使用未定义的常量 _ - 假定为“_”(这将在 PHP 的未来版本中引发错误)

PayPal IPN 脚本未重定向到 ipn.php

在 AWS Elastic Beanstalk 上部署后运行 PHP 脚本

错误解码:TypeError:无法读取未定义的属性“2”

将多个平台部署到 Elastic Beanstalk (PHP/Python)