【问题标题】:Force GET variable (url) to not be encoded强制 GET 变量(url)不被编码
【发布时间】:2014-04-30 13:58:47
【问题描述】:

我用 PHP 编码已经有一段时间了,这是我第一次遇到这个问题。 我的目标是在不编码或解码的情况下传递一个 GET 变量(一个 url)。这意味着“%2F”不会变成“/”,反之亦然。原因是我将此变量传递给第 3 方网站,而变量必须保持原样。

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

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

【问题讨论】:

  • 请提供完整的演示,说明您在此处所做的工作以及“PHP 是如何对其进行编码/解码”。
  • 网址中不能有空格

标签: php url encode


【解决方案1】:

出于安全原因,Apache 拒绝在路径部分使用 %2F 的所有 URL:由于 PATH_INFO 环境变量被自动 URL 解码,脚本通常无法(即不重写)分辨 %2F 和 / 之间的区别(这很愚蠢,但它是 CGI 规范的长期组成部分,所以对此无能为力)。

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

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

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

不同之处在于 + 并不意味着路径部分中的空格。 rawurlencode() 将正确生成 %20,这将适用于表单编码数据和 URL 的其他部分。

【讨论】:

  • 感谢您的解释。最终,我发现在将斜线传递到下一页并用临时变量替换它之前更容易找到斜线(以及在我将 url 传递到第 3 方网站之前的相反操作)
【解决方案2】:

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

用途:

请展示一个实际示例,说明您如何将 url 发送给第 3 方。

因为它应该读为http%3A%2F%2Fexample.com%2Fsomething%2Felse 而不仅仅是像你的例子中那样奇怪的%2F

【讨论】:

    猜你喜欢
    • 2017-07-15
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多