提问人:Benedikt Waldvogel 提问时间:9/3/2008 最后编辑:oHoBenedikt Waldvogel 更新时间:7/4/2017 访问量:64939
URL 中是否允许使用方括号?
Are square brackets permitted in URLs?
问:
URL 中是否允许使用方括号?
我注意到 Apache commons HttpClient (3.0.1) 抛出了一个 IOException,wget 和 Firefox 但是接受方括号。
URL 示例:
http://example.com/path/to/file[3].html
我的 HTTP 客户端遇到这样的 URL,但我不确定是修补代码还是抛出异常(实际上应该如此)。
答:
最好对它们进行 URL 编码,因为它们显然不是在所有 Web 服务器中都受支持。有时,即使有标准,也不是每个人都遵循它。
路径名中几乎唯一不允许的字符是 # 和 ?因为它们表示路径的尽头。
uri rfc 将有明确的答案:
http://www.ietf.org/rfc/rfc1738.txt
不安全的:
由于多种原因,角色可能不安全。空间 字符是不安全的,因为重要的空间可能会消失,并且 转录 URL 时可能会引入无关紧要的空格,或者 排版或经过文字处理程序的处理。 字符“<”和“>”是不安全的,因为它们被用作 自由文本中 URL 周围的分隔符;引号 (“”“) 用于 在某些系统中分隔 URL。字符“#”不安全,应该 始终进行编码,因为它用于万维网和其他 系统从片段/锚标识符中分隔 URL,该标识符可能 跟着它。字符“%”是不安全的,因为它用于 其他字符的编码。其他角色不安全,因为 已知网关和其他传输代理有时会修改 这样的角色。这些字符是 “{”, “}”, “|”, “\”, “^”, “~”, “[”, “]” 和 “'”。
所有不安全的字符必须始终在 URL 中编码。为 例如,字符“#”必须在 URL 中编码,即使在 通常不处理 fragment 或锚点的系统 标识符,因此,如果将 URL 复制到另一个系统中,则 确实使用它们,则无需更改 URL 编码。
答案是它们应该是十六进制编码的,但知道波斯特尔定律,大多数事情都会逐字接受它们。
评论
根据 URL 规范,方括号不是有效的 URL 字符。
以下是相关片段:
“国家”和“标点符号”字符不会出现在任何 制作,因此可能不会出现在 URL 中。
国家 { | } |VLINE公司 |[ | ]|\ |^ |~
标点符号 < |>
任何接受 URL 并且在引入特殊字符时不会引发异常的浏览器或支持 Web 的软件几乎可以保证在后台对特殊字符进行编码。大括号、方括号、空格等都有特殊的编码方式来表示它们,以免产生冲突。根据前面的答案,处理这些问题的最安全方法是先对它们进行 URL 编码,然后再将它们交给尝试解析 URL 的东西。
评论
要使用 HttpClient commons 类,您需要查看 org.apache.commons.httpclient.util.URIUtil 类,特别是 encode() 方法。在尝试获取 URL 之前,使用它对 URL 进行 URI 编码。
RFC 3986 状态
由 Internet 标识的主机 协议文本地址,版本 6 [RFC3513] 或更高版本,是区分的 通过将 IP 文本包含在 方括号(“[”和“]”)。这 是唯一一个方括号的地方 URI 中允许使用字符 语法。
因此,从理论上讲,您不应该在野外看到这样的 URI,因为它们应该经过编码。
评论
我知道这个问题有点老了,但我只是想指出,PHP 使用括号在 URL 中传递数组。
http://www.example.com/foo.php?bar[]=1&bar[]=2&bar[]=3
在这种情况下,将包含 .$_GET['bar']
array(1, 2, 3)
评论
StackOverflow 似乎没有对它们进行编码:
https://stackoverflow.com/search?q=square+brackets+[网址]
评论
方括号被认为是不安全的,但大多数浏览器会正确解析它们。话虽如此,最好用其他一些字符替换方括号。
评论
通常不支持方括号和 URL 中。[
]
将它们替换为 和 :%5B
%5D
使用命令行,以下示例基于 和 :
bash
sed
url='http://example.com?day=[0-3][0-9]' encoded_url="$( sed 's/\[/%5B/g;s/]/%5D/g' <<< "$url")"
使用 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
评论