URL 中允许使用方括号吗?
-
09-06-2019 - |
题
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 似乎没有对它们进行编码:
最好对它们进行 URL 编码,因为显然并非所有 Web 服务器都支持它们。有时,即使有标准,也不是每个人都遵循它。
根据 网址规范, ,方括号不是有效的 URL 字符。
以下是相关片段:
“国家”和“标点符号”字符均未出现在任何作品中,因此可能不会出现在URL中。
国家{| } | vline | [| ] | | ^ | 〜
标点符号<| >
方括号 [
和 ]
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), '">'; ?>
使用您最喜欢的编程语言...请通过发表评论或直接编辑此答案来扩展此答案,以添加您从编程语言中使用的功能;-)
有关更多详细信息,请参阅 RFC 3986 指定 URL 语法。这 附录 A 是关于 %-encoding
在查询字符串中(括号属于 “gen-delims” 成为 %-encoded
).
方括号被认为是不安全的,但大多数浏览器都会正确解析它们。话虽如此,最好用一些其他字符替换方括号。