Apache URL中是否允许使用方括号?

Apache URL中是否允许使用方括号?,apache,http,url,syntax,square-bracket,Apache,Http,Url,Syntax,Square Bracket,URL中是否允许使用方括号 我注意到(3.0.1)抛出了一个IOException,wget和Firefox接受方括号 URL示例: http://example.com/path/to/file[3].html 我的HTTP客户端遇到这样的URL,但我不确定是修补代码还是引发异常(实际上应该是这样)。最好对这些URL进行编码,因为显然并非所有web服务器都支持它们。有时,即使有一个标准,也不是每个人都遵循它。路径名中不允许的字符几乎只有#和?因为它们意味着道路的尽头 uri rfc将有明确的

URL中是否允许使用方括号

我注意到(3.0.1)抛出了一个IOException,wget和Firefox接受方括号

URL示例:

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

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

最好对这些URL进行编码,因为显然并非所有web服务器都支持它们。有时,即使有一个标准,也不是每个人都遵循它。

路径名中不允许的字符几乎只有#和?因为它们意味着道路的尽头

uri rfc将有明确的答案:

不安全:

由于多种原因,字符可能不安全。空间 字符不安全,因为有效空格可能会消失并 在转录或删除URL时,可能会引入不重要的空格 排版的或经过文字处理程序处理的。 字符“”不安全,因为它们被用作 自由文本中URL周围的分隔符;引号(“”)用于 在某些系统中分隔URL。字符“#”不安全,应 始终进行编码,因为它在万维网和其他应用程序中使用 系统将URL与可能存在错误的片段/锚点标识符分隔开来 跟随它。字符“%”不安全,因为它用于 其他字符的编码。其他字符不安全,因为 已知网关和其他传输代理有时会修改 这些字符是“{”、“}”、“|”、“\”、“^”、“~”, “[”、“]”和“`”

所有不安全字符必须始终在URL中编码。对于 例如,字符“#”必须在URL中编码,即使在 通常不处理碎片或锚的系统 标识符,因此如果URL被复制到另一个系统中 如果不使用它们,则无需更改URL编码

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

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

以下是相关片段:

“国家”和“标点”字符不会出现在任何 产品,因此可能不会出现在URL中。
国家{124;}线{124;[|]线{124;}线 标点符号<|>


任何接受URL且在引入特殊字符时不会引发异常的浏览器或web启用软件几乎都可以保证在幕后对特殊字符进行编码。花括号、方括号、空格等都有特殊的编码方式来表示它们,以免产生冲突。根据对于这些问题,最安全的处理方法是在将它们交给试图解析URL的对象之前对它们进行URL编码。

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

声明

由因特网识别的主机 协议文本地址,版本6 [RFC3513]或更高版本 通过在 方括号(“[”和“]”)。此 是唯一一个放方括号的地方 URI中允许使用字符 语法


因此,理论上你不应该在野外看到这样的URI,因为它们应该经过编码。

我知道这个问题有点老了,但我只想指出PHP使用括号来传递URL中的数组

http://www.example.com/foo.php?bar[]=1&bar[]=2&bar[]=3

在这种情况下,
$\u GET['bar']
将包含
数组(1,2,3)

堆栈溢出似乎不会对它们进行编码:


方括号被认为是不安全的,但大多数浏览器都会正确解析这些字符。尽管如此,还是用其他字符替换方括号更好。

URL中的方括号
[
]
通常不受支持

将它们替换为
%5B
%5D
  • 使用命令行,以下示例基于
    bash
    sed

    url='http://example.com?day=[0-3][0-9]'
    encoded_url="$( sed 's/\[/%5B/g;s/]/%5D/g' <<< "$url")"
    
    输出:

    <a href="http://example.com/day/%5B0-3%5D%5B0-9%5D">
    

    指定URL语法。附录A是关于查询字符串中的
    %-编码
    (括号属于要进行
    %-编码的“gen delims”).

    所有不安全字符必须始终在URL中编码。必须,而不是应该。正确,但当浏览器未自动执行此操作时,仍应对其进行编码。PHP仍将正确解释方括号及其自己的http_build_query()函数也会对它们进行编码。我相信您看到的是您的浏览器接受它们作为输入。但是,如果您单击Stackoverflow结果页面上的某个选项卡,它会对括号进行编码…search?tab=newest&q=square%20方括号%20%5burl%5dI检查了请求标题和位置文本,并且它们没有在Chrome中编码。W我们需要做什么样的测试来确定这些行为是否被“容忍”?这适用于空格和其他特殊字符,但不适用于方括号。当我进入地址栏时,我看到了在HTTP中发送的方括号。Firefox在地址栏中向您显示了一个用户友好的URL,但它实际发送的URL已编码了特殊字符。
    <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), '">';
    ?>