网址中是否允许使用方括号?

时间:2008-09-02 20:35:24

标签: apache http url syntax square-bracket

是否允许使用网址中的方括号?

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

网址示例:

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

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

10 个答案:

答案 0 :(得分:38)

RFC 3986

  

互联网识别的主机   协议文字地址,版本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似乎不对它们进行编码:

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

答案 6 :(得分:1)

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

答案 7 :(得分:1)

根据URL specification,方括号不是有效的网址字符。

以下是相关摘录:

  

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

答案 8 :(得分:1)

网址中的方括号[]通常不受支持。

将其替换为%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)。

答案 9 :(得分:0)

方括号被认为是不安全的,但大多数浏览器会正确解析它们。说过用方括号替换方括号更好。