【问题标题】:Why doesn't URI.escape escape single quotes?为什么 URI.escape 不转义单引号?
【发布时间】:2011-10-11 20:12:14
【问题描述】:

为什么URI.escape 不转义单引号?

URI.escape("foo'bar\" baz")
=> "foo'bar%22%20baz"

【问题讨论】:

  • 因为单引号是合法的 URI 字符。 stackoverflow.com/questions/1547899/…
  • 嗯.. 虽然它们是保留的,这意味着它们是允许的,但具有特殊的句法含义。在这种情况下,我不希望它们具有特殊含义,它是用户输入的数据,它不应该被解释为语法,而是被浏览器和 Web 应用程序以及它们之间的所有层解释为数据。所以我想真正的问题是,“逃脱”是什么意思......
  • 根据the docs,它将转义REGEX::UNSAFE定义的“不安全”字符。您可以自己传递。
  • FWIW 我在这里是因为当您尝试运行失效时,AWS Cloudfront 期望 URI 中的单引号被转义为 %27。所以,我猜这对某些人来说是合法的,而对其他人来说是不合法的。

标签: ruby url uri


【解决方案1】:

出于同样的原因,它不会转义 ?/: 等等。 URI.escape() 只转义不能在 URL 中使用的字符根本,而不是具有特殊含义的字符。

你要找的是CGI.escape():

require "cgi"
CGI.escape("foo'bar\" baz")
=> "foo%27bar%22+baz"

【讨论】:

  • 我不确定这有什么帮助。 CGI 转义与 URI 转义所做的事情不同,而且它们不可互换。
  • @cbmanica。这是真的,但是大多数使用这个库的人实际上是在寻找对字符串进行 URL 编码的。请参阅this excellent answer 了解替代方案的详细介绍。
【解决方案2】:

这是一个老问题,但答案已经很久没有更新了。我想我会为遇到同样问题的其他人更新这个。我找到的解决方案是posted here:如果您有可用的erb 模块,请使用ERB::Util.url_encode。这也为我处理了单引号和*

CGI::escape 不能正确转义空格 (%20) 与加号。

【讨论】:

    【解决方案3】:

    根据文档,URI.escape(str [, unsafe]) 使用正则表达式匹配所有必须用代码替换的符号。默认情况下,该方法使用 REGEXP::UNSAFE。当该参数为 String 时,表示一个字符集。

    在您的情况下,要修改 URI.escape 以转义甚至单引号,您可以执行以下操作...

    reserved_characters = /[^a-zA-Z0-9\-\.\_\~]/
    URI.escape(YOUR_STRING, reserved_characters)
    

    说明:关于规范的一些信息...

    所有参数名称和值都使用 [rfc3986] 进行转义 百分比编码 (%xx) 机制。未保留的字符 必须对字符集([rfc3986] 第 2.3 节)进行编码。中的字符 不得对未保留的字符集进行编码。十六进制 编码中的字符必须大写。文本名称和值必须 在按照 [rfc3629] 对它们进行百分比编码之前被编码为 utf-8 八位字节。

    【讨论】:

    • URI.escape 已弃用。即使它仍然存在,最好使用此处发布的其他解决方案之一。
    • @MarkThomas 我同意。我把它放在这里是为了存档,以详细说明如何修改正则表达式,因为它是顺便提到的。
    【解决方案4】:

    我知道这已经得到解答,但我想要的是稍微不同的东西,我想我不妨把它贴出来:我想在 url 中保留“/”,但避开所有其他非标准人物。我是这样做的:

    #public filename is a *nix filepath, 
    #like `"/images/isn't/this a /horrible filepath/hello.png"`
    
    public_filename.split("/").collect{|s| ERB::Util.url_encode(s)}.join("/")
    => "/images/isn%27t/this%20a%20/horrible%20filepath/hello.png"
    

    我需要转义单引号,因为我正在为 AWS Cloudfront 编写缓存失效,它不喜欢单引号并希望它们被转义。以上应该使 uri 比标准 URI.escape 更安全,但看起来仍然像 URI(CGI Escape 通过转义“/”来破坏 uri 格式)。

    【讨论】:

      猜你喜欢
      • 2011-01-06
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      相关资源
      最近更新 更多