50

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

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

网址示例:

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

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

4

10 回答 10

56

RFC 3986状态

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

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

于 2009-06-19T07:23:04.400 回答
17
于 2017-07-04T09:13:41.263 回答
15

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

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

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

于 2009-11-11T21:33:17.913 回答
5

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

uri rfc 将有明确的答案:

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

不安全:

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

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

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

于 2008-09-02T20:39:34.467 回答
5

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

于 2008-09-02T20:42:28.827 回答
2

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

于 2008-09-15T20:24:53.080 回答
2

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

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

于 2010-06-14T12:47:54.783 回答
1

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

于 2008-09-02T20:36:36.113 回答
1

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

以下是相关片段:

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

于 2008-09-02T20:41:14.137 回答
1

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

于 2016-08-01T22:25:04.980 回答