URL 中允许使用方括号吗?

我注意到 Apache 公共 HttpClient (3.0.1) 抛出 IOException,但 wget 和 Firefox 接受方括号。

网址示例:

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

我的 HTTP 客户端遇到此类 URL,但我不确定是否要修补代码或引发异常(实际上应该如此)。

有帮助吗?

解决方案

RFC 3986 状态

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

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

其他提示

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

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

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

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

路径名中唯一不允许使用的字符几乎是 # 和 ?因为它们意味着路径的终点。

uri rfc 将会有最终的答案:

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

不安全:

由于多种原因,角色可能不安全。空间特征是不安全的,因为当URL被转录或排版或接受文字处理程序处理时,可能会引入微不足道的空间。字符“ <”和“>”是不安全的,因为它们被用作自由文本中URL周围的定界符;报价标记(“”)用于在某些系统中界定URL。字符“#”是不安全的,应始终编码,因为它用于万维网和其他系统中,以从可能遵循的片段/锚定标识符中界定URL。字符“%”不安全,因为它用于其他字符的编码。其他字符是不安全的,因为已知网关和其他运输代理有时会修改此类字符。这些字符为“ {”,“}”,“ |”,“ ”,“^”,“〜”,“”,“,”,“]和“”。

所有不安全字符必须始终编码在 URL 中。例如,即使在通常不处理片段或锚定标识符的系统中,角色“#”也必须在URL中进行编码,以便如果将URL复制到确实使用它们的另一个系统中,则无需更改URL编码。

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

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

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

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

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

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

以下是相关片段:

“国家”和“标点符号”字符均未出现在任何作品中,因此可能不会出现在URL中。
国家{| } | vline | [| ] | | ^ | 〜
标点符号<| >

方括号 [] 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), '">';
    ?>
    
  • 使用您最喜欢的编程语言...请通过发表评论或直接编辑此答案来扩展此答案,以添加您从编程语言中使用的功能;-)

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top