URL中是否允许方括号?
我注意到Apache commons HttpClient(3.0.1)会抛出IOException,但wget和Firefox支持方括号。
URL示例:
http://example.com/path/to/file[3].html
我的HTTP客户端遇到了这样的URL,但我不确定是要修补代码还是抛出异常(实际上应该是抛出异常)。
URL中是否允许方括号?
我注意到Apache commons HttpClient(3.0.1)会抛出IOException,但wget和Firefox支持方括号。
URL示例:
http://example.com/path/to/file[3].html
我的HTTP客户端遇到了这样的URL,但我不确定是要修补代码还是抛出异常(实际上应该是抛出异常)。
RFC 3986指出:
标识为Internet协议字面地址的主机,版本6 [RFC3513] 或更高版本,应该使用方括号(“[”和“]”)将IP字面值包含在内以进行区分。这是URI语法中允许使用方括号字符的唯一位置。
因此理论上您不应该在实际应用中看到这样的URI,因为它们应该被编码后再发送。
URL中的方括号[
和]
通常不被支持。
%5B
和%5D
代替它们:使用命令行,以下示例基于bash
和sed
:
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), '">';
?>
使用你最喜欢的编程语言...请通过发表评论或直接编辑此答案来添加你从编程语言中使用的函数;-)
有关详细信息,请参见RFC 3986,指定URL语法。附录A为查询字符串中的%-encoding
(方括号属于“gen-delims”,应%-encoded
)。
我知道这个问题有点老了,但我想指出PHP使用方括号在URL中传递数组。
http://www.example.com/foo.php?bar[]=1&bar[]=2&bar[]=3
在这种情况下,$_GET ['bar']
将包含array(1,2,3)
。http://www.ietf.org/rfc/rfc1738.txt
答案是它们应该进行十六进制编码,但根据波斯特尔法则,大多数情况下都可以直接接受它们。不安全的字符:
字符可能因为多种原因而不安全。空格字符是不安全的,因为当URL被转录、排版或经过文字处理程序处理时,重要的空格可能会消失,而无关紧要的空格可能会引入。"<"和">"字符是不安全的,因为它们在自由文本中用作URL周围的分隔符; 引号(""")用于在某些系统中分隔URL。"#"字符是不安全的,并且应始终进行编码,因为它在万维网和其他系统中用于将URL与可能跟随其后的片段/锚点标识符分隔开来。百分号("%")字符是不安全的,因为它用于对其他字符进行编码。其他字符也是不安全的,因为网关和其他传输代理有时已知会修改这些字符。这些字符包括"{", "}", "|", "\", "^", "~", "[", "]", 和 "`"。
所有不安全的字符必须始终在URL中进行编码。例如,即使在不通常处理片段或锚点标识符的系统中,"#"字符也必须在URL中进行编码,以便如果将URL复制到使用它们的另一个系统中,就不需要更改URL编码。
StackOverflow似乎没有对它们进行编码:
如果要使用HttpClient常见类,您需要查看org.apache.commons.httpclient.util.URIUtil类,特别是encode()方法。在尝试获取URL之前,请使用该方法对URL进行URI编码。
方括号被认为是不安全的,但大多数浏览器仍然可以正确解析。尽管如此,最好用其他字符替换方括号。
“国家”和“标点符号”字符不出现在任何生产中,因此可能不会出现在URL中。
国家 { | } | vline | [ | ] | \ | ^ | ~
标点符号 < | >