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

URL中的方括号是否允许?

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

url示例:

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

我的HTTP客户端遇到这样的URL,但我不确定是要修补代码还是抛出一个exception(实际上应该是这样)。

RFC 3986声明

IP地址版本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)

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

在路径名中只有不允许的字符是#和? 因为它们表示路径的结束。

uri rfc将有一个明确的答案:

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

不安全:

字符可能由于多种原因而不安全。 空格字符是不安全的,因为重要空格可能会消失,当URL被转录或排版或受到文字处理程序的处理时,可能引入不重要的空格。 字符“<”和“>”是不安全的,因为它们被用作自由文本中的URL周围的分隔符; 在某些系统中,引号(“”)用于分隔URL,字符“#”是不安全的,应该总是被编码,因为它在万维网和其他系统中被用来从片段/锚标识符可能跟着它,字符“%”是不安全的,因为它用于其他字符的编码,其他字符是不安全的,因为网关和其他传输代理有时会修改这些字符,这些字符是“{”,“} “,”|“,”\“,”^“,”〜“,”[“,”]“和”`“。

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

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

StackOverflow似乎不编码他们:

https://stackoverflow.com/search?q=square+brackets+%5Burl%5D

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

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

以下是相关的片段:

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

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

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

通常不支持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), '">'; ?> 
  • 使用你最喜欢的编程语言…请发表评论或直接编辑这个答案来扩展这个答案,以添加你使用的编程语言功能;-)

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