是否允许使用网址中的方括号?
我注意到Apache commons HttpClient(3.0.1)抛出IOException,wget和Firefox接受方括号。
网址示例:
http://example.com/path/to/file[3].html
我的HTTP客户端遇到这样的URL,但我不确定是要修补代码还是抛出异常(实际应该是这样)。
答案 0 :(得分:38)
互联网识别的主机 协议文字地址,版本6 [RFC3513]或更高版本,是有区别的 将IP文字括在里面 方括号(“[”和“]”)。这个 是方括号的唯一地方 URI中允许使用字符 语法。
所以你不应该在理论上看到这样的URI,因为它们应该到达编码。
答案 1 :(得分:8)
我知道这个问题有点旧,但我只想注意PHP使用括号来传递URL中的数组。
http://www.example.com/foo.php?bar[]=1&bar[]=2&bar[]=3
在这种情况下,$_GET['bar']
将包含array(1, 2, 3)
。
答案 2 :(得分:5)
任何支持URL并且在引入特殊字符时不会抛出异常的浏览器或支持Web的软件几乎可以保证在后台对特殊字符进行编码。卷括号,方括号,空格等都有特殊的编码方式来表示它们,以免产生冲突。根据之前的答案,处理这些问题最安全的方法是对它们进行URL编码,然后再将它们交给试图解析URL的内容。
答案 3 :(得分:4)
几乎唯一不允许在路径名中使用的字符是#和?因为它们意味着路径的终点。
uri rfc将有明确的答案:
http://www.ietf.org/rfc/rfc1738.txt
不安全:
由于多种原因,角色可能不安全。空间 角色是不安全的,因为重要的空间可能会消失 当转录URL时,可能会引入无关紧要的空格 排版或受到文字处理程序的处理。 字符“<”和“>”是不安全的,因为它们被用作 自由文本中的URL分隔符;引号(“”“)用于表示 在某些系统中划分URL。字符“#”是不安全的,应该 总是被编码,因为它在万维网和其他网络中使用 用于从可能的片段/锚标识符界定URL的系统 跟着它。字符“%”是不安全的,因为它用于 其他角色的编码。其他角色不安全因为 已知网关和其他传输代理有时会修改 这样的人物。这些字符是“{”,“}”,“|”,“\”,“^”,“〜”, “[”,“]”和“`”。
所有不安全的字符必须始终在URL中编码。对于 例如,字符“#”必须在URL中编码,即使在 通常不处理片段或锚点的系统 标识符,以便将URL复制到另一个系统中 确实使用它们,没有必要更改URL编码。
答案是他们应该是十六进制编码,但是知道postel定律,大多数事情都会逐字接受。
答案 4 :(得分:2)
对于使用HttpClient commons类,您需要查看org.apache.commons.httpclient.util.URIUtil类,特别是encode()方法。在尝试获取URL之前,使用它对URL进行URI编码。
答案 5 :(得分:2)
StackOverflow似乎不对它们进行编码:
答案 6 :(得分:1)
最好对URL进行编码,因为它们在所有Web服务器中都不受支持。有时,即使有标准,也不是每个人都遵循它。
答案 7 :(得分:1)
根据URL specification,方括号不是有效的网址字符。
以下是相关摘录:
“国家”和“标点符号”字符不会出现在任何字符中 制作,因此可能不会出现在URL中 国家{| } | vline | [| ] | \ | ^ | 〜
标点符号< | >
答案 8 :(得分:1)
网址中的方括号[
和]
通常不受支持。
%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 在查询字符串中约为%-encoding
(括号属于“gen-delims”为%-encoded
)。
答案 9 :(得分:0)
方括号被认为是不安全的,但大多数浏览器会正确解析它们。说过用方括号替换方括号更好。