强制GET变量(url)不被编码

时间:2014-04-30 13:58:48

标签: php url encode

我已经在PHP编写了一段时间,这是我第一次遇到这个问题。 我的目标是传递一个GET变量(一个url)而不对其进行编码或解码。这意味着“%2F”不会转为“/”而反之亦然。这样做的原因是我将这个变量传递给第三方网站,而且可变量必须保持原样。

现在正在发生的事情是这个网址(作为GET变量传递):http://example.com/something%2Felse变为http://example.com/something/else

如何防止php对GET中传递的内容进行编码?

2 个答案:

答案 0 :(得分:3)

出于安全原因,Apache拒绝路径部分中所有带有%2F的URL:脚本无法正常(即没有重写)告诉%2F和/之间的区别,因为PATH_INFO环境变量会自动进行URL解码(这是愚蠢的,但是CGI规范的一个长期内容,所以没有什么可以做的。)

您可以使用AllowEncodedSlashes指令关闭此功能,但请注意其他Web服务器仍然会禁止它(没有选项将其关闭),其他字符也可能是禁忌(例如%5C),并且特别是%00将始终被Apache和IIS阻止。因此,如果您的应用程序依赖于能够在路径部分中包含%2F或其他字符,那么您将限制兼容性/部署选项。

我在准备搜索网址时使用urlencode()

你应该使用rawurlencode(),而不是urlencode()来转义路径部分。 urlencode()名称错误,实际上是application / x-www-form-urlencoded数据,例如查询字符串或POST请求的正文,而不是URL的其他部分。

区别在于+并不意味着路径部分的空间。 rawurlencode()将正确生成%20,这将在表单编码数据和URL的其他部分中起作用。

答案 1 :(得分:0)

Hex base16编码它是HTTP协议的一部分,你不能阻止它,否则它会破坏对服务器的实际HTTP套接字请求。

使用:

请显示您如何将网址发送给第三方的实际示例。

因为它应该在您的示例中阅读http%3A%2F%2Fexample.com%2Fsomething%2Felse,而不仅仅是奇怪的%2F