Apache URL中是否允许使用方括号?
URL中是否允许使用方括号 我注意到(3.0.1)抛出了一个IOException,wget和Firefox接受方括号 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将有明确的
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), '">'; ?>