URL 中是否允许使用方括号?

Are square brackets permitted in URLs?

提问人:Benedikt Waldvogel 提问时间:9/3/2008 最后编辑:oHoBenedikt Waldvogel 更新时间:7/4/2017 访问量:64939

问:

URL 中是否允许使用方括号?

我注意到 Apache commons HttpClient (3.0.1) 抛出了一个 IOException,wget 和 Firefox 但是接受方括号。

URL 示例:

http://example.com/path/to/file[3].html

我的 HTTP 客户端遇到这样的 URL,但我不确定是修补代码还是抛出异常(实际上应该如此)。

Apache HTTP URL 语法 括号

评论

0赞 DJDaveMark 1/16/2020
Firefox 在地址栏中显示一个用户友好的 URL,但它实际发送的 URL 使用了特殊字符编码。
0赞 That Realty Programmer Guy 9/24/2021
许多版本的Wordpress和Magento都使用未编码的方括号,因此,如果您要制作客户端,我建议您只发出警告或消息级别问题。归根结底,您应该假设应用程序开发人员不会为您提供原始输入,并且您不希望依赖当前仅依赖于应用程序选择的网关的行为

答:

1赞 Ben Scheirman 9/3/2008 #1

最好对它们进行 URL 编码,因为它们显然不是在所有 Web 服务器中都受支持。有时,即使有标准,也不是每个人都遵循它。

5赞 1729 9/3/2008 #2

路径名中几乎唯一不允许的字符是 # 和 ?因为它们表示路径的尽头。

uri rfc 将有明确的答案:

http://www.ietf.org/rfc/rfc1738.txt

不安全的:

由于多种原因,角色可能不安全。空间 字符是不安全的,因为重要的空间可能会消失,并且 转录 URL 时可能会引入无关紧要的空格,或者 排版或经过文字处理程序的处理。 字符“<”和“>”是不安全的,因为它们被用作 自由文本中 URL 周围的分隔符;引号 (“”“) 用于 在某些系统中分隔 URL。字符“#”不安全,应该 始终进行编码,因为它用于万维网和其他 系统从片段/锚标识符中分隔 URL,该标识符可能 跟着它。字符“%”是不安全的,因为它用于 其他字符的编码。其他角色不安全,因为 已知网关和其他传输代理有时会修改 这样的角色。这些字符是 “{”, “}”, “|”, “\”, “^”, “~”, “[”, “]” 和 “'”。

所有不安全的字符必须始终在 URL 中编码。为 例如,字符“#”必须在 URL 中编码,即使在 通常不处理 fragment 或锚点的系统 标识符,因此,如果将 URL 复制到另一个系统中,则 确实使用它们,则无需更改 URL 编码。

答案是它们应该是十六进制编码的,但知道波斯特尔定律,大多数事情都会逐字接受它们。

评论

7赞 plaugg 7/24/2012
所有不安全的字符必须始终在 URL 中编码。必须,不应该。
0赞 That Realty Programmer Guy 9/24/2021
@plaugg客户端存在于现实世界中,这个答案的“应该”的上下文也存在,而规范存在于一个形式化的信息系统中。也就是说,要正式合规,是的,您必须对它们进行编码。然而,在现实中,人们只能大胆地认为你应该对它们进行编码,因为它们在一般情况下会很好地工作。事实上,应该更改规范以反映使用情况
1赞 17 of 26 9/3/2008 #3

根据 URL 规范,方括号不是有效的 URL 字符。

以下是相关片段:

“国家”和“标点符号”字符不会出现在任何 制作,因此可能不会出现在 URL 中。
国家 { | } |VLINE公司 |[ | ]|\ |^ |~
标点符号 < |>

5赞 Lee 9/3/2008 #4

任何接受 URL 并且在引入特殊字符时不会引发异常的浏览器或支持 Web 的软件几乎可以保证在后台对特殊字符进行编码。大括号、方括号、空格等都有特殊的编码方式来表示它们,以免产生冲突。根据前面的答案,处理这些问题的最安全方法是先对它们进行 URL 编码,然后再将它们交给尝试解析 URL 的东西。

评论

0赞 Franklin Yu 4/8/2019
对于空格和其他特殊字符,这是正确的,但对于方括号则不然。当我在地址栏中输入 example.com/?a[]=1 时,我看到方括号在 HTTP 中未转义。
1赞 Olivier Masseau 2/21/2022
Chrome (98) 和 Firefox (97) 未对 [ 和 ] 字符进行编码
2赞 rjray 9/16/2008 #5

要使用 HttpClient commons 类,您需要查看 org.apache.commons.httpclient.util.URIUtil 类,特别是 encode() 方法。在尝试获取 URL 之前,使用它对 URL 进行 URI 编码。

62赞 Justin Cormack 6/19/2009 #6

RFC 3986 状态

由 Internet 标识的主机 协议文本地址,版本 6 [RFC3513] 或更高版本,是区分的 通过将 IP 文本包含在 方括号(“[”和“]”)。这 是唯一一个方括号的地方 URI 中允许使用字符 语法。

因此,从理论上讲,您不应该在野外看到这样的 URI,因为它们应该经过编码。

评论

0赞 That Realty Programmer Guy 9/24/2021
事实上,许多框架确实在野外使用未编码的它们。尤其是在查询字符串中,但并非独有。
15赞 MM. 11/12/2009 #7

我知道这个问题有点老了,但我只是想指出,PHP 使用括号在 URL 中传递数组。

http://www.example.com/foo.php?bar[]=1&bar[]=2&bar[]=3

在这种情况下,将包含 .$_GET['bar']array(1, 2, 3)

评论

18赞 Wilco 7/28/2012
正确,但当浏览器没有自动编码时,仍应对其进行编码。PHP 仍然会正确地解释括号,并且它自己的 http_build_query() 函数也会对它们进行编码。
0赞 That Realty Programmer Guy 9/24/2021
@Wilco撇开意见不谈,它们并没有被许多PHP框架编码
2赞 Casebash 6/14/2010 #8

StackOverflow 似乎没有对它们进行编码:

https://stackoverflow.com/search?q=square+brackets+[网址]

评论

7赞 Feckmore 10/30/2014
我相信你看到的是你的浏览器接受它们作为输入。但是,如果您单击 Stackoverflow 结果页面上的选项卡之一,它会对括号进行编码......search?tab=newest&q=square%20brackets%20%5burl%5d
2赞 QueueHammer 3/25/2021
我检查了请求标头和位置文本,它们没有在 Chrome 中编码。我们必须做什么样的测试才能看到是否“耐受”?
1赞 sixtytrees 8/2/2016 #9

方括号被认为是不安全的,但大多数浏览器会正确解析它们。话虽如此,最好用其他一些字符替换方括号。

评论

0赞 Olivier Masseau 2/21/2022
问题是,大多数浏览器根本不对方括号进行编码
28赞 oHo 7/4/2017 #10

通常不支持方括号和 URL 中。[]

将它们替换为 和 :%5B%5D

  • 使用命令行,以下示例基于 和 :bashsed

    url='http://example.com?day=[0-3][0-9]'
    encoded_url="$( sed 's/\[/%5B/g;s/]/%5D/g' <<< "$url")"
    
  • 使用 Java URLEncoder.encode(String s, String enc)

  • 使用 PHP rawurlencode() 或 urlencode(

    <?php
    echo '<a href="http://example.com/day/',
        rawurlencode('[0-3][0-9]'), '">';
    ?>
    

    输出:

    <a href="http://example.com/day/%5B0-3%5D%5B0-9%5D">
    

    或:

    <?php
    $query_string = 'day=' . urlencode('[0-3][0-9]') .
                    '&month=' . urlencode('[0-1][0-9]');
    echo '<a href="http://example.com?',
          htmlentities($query_string), '">';
    ?>
    
  • 使用您最喜欢的编程语言...请通过发表评论或直接编辑此答案来扩展此答案,以添加您从编程语言中使用的函数 ;-)

有关详细信息,请参阅指定 URL 语法的 RFC 3986附录 A 是关于在查询字符串中的(括号属于 “gen-delims” 是 )。%-encoding%-encoded

评论

2赞 That Realty Programmer Guy 9/24/2021
请支持“通常不支持”的说法,经过相当广泛的测试,这似乎是非常错误的