Mar*_*ski 95
根据RFC 1738:
不安全:
出于多种原因,角色可能不安全. 空间字符是不安全的,因为当URL被转录或排版或受到文字处理程序的处理时,重要的空格可能会消失并且可能引入无关紧要的空间. 字符
"<"
和">"
,因为它们被用作在周围自由文本网址的分隔符是不安全的; quote mark("""
)用于分隔某些系统中的URL.该字符"#"
是不安全的,应该始终进行编码,因为它在万维网和其他系统中用于从可能跟随它的片段/锚标识符中分隔URL.人物"%"
是不安全的,因为它用于其他字符的编码.其他字符是不安全的,因为已知网关和其他传输代理有时会修改这些字符.这些字符是"{"
,"}"
,"|"
,"\"
,"^"
,"~"
,"["
,"]"
,和"`"
.所有不安全的字符必须始终在URL中编码.例如,
"#"
即使在通常不处理片段或锚标识符的系统中,字符也必须在URL中编码,因此如果将URL复制到另一个使用它们的系统中,则无需更改URL编码.
Jul*_*ien 42
为什么必须编码?请求如下所示:
GET /url HTTP/1.1
(Ignoring headers)
Run Code Online (Sandbox Code Playgroud)
有3个字段由空格分隔.如果你在网址中加了一个空格:
GET /url end_url HTTP/1.1
Run Code Online (Sandbox Code Playgroud)
你知道有4个字段,HTTP服务器会告诉你这是一个无效的请求.
GET /url%20end_url HTTP/1.1
Run Code Online (Sandbox Code Playgroud)
3个字段=>有效
注意:在查询字符串中(在?之后),空格通常编码为+
GET /url?var=foo+bar HTTP/1.1
Run Code Online (Sandbox Code Playgroud)
而不是
GET /url?var=foo%20bar HTTP/1.1
Run Code Online (Sandbox Code Playgroud)
URL中可以包含空格字符,并且在大多数浏览器中它们将显示为%20,但浏览器编码规则经常更改,我们无法依赖浏览器如何显示URL.
所以相反,你可以用你认为会使URL更具可读性和'漂亮'的任何字符替换URL中的空格字符.)所以首选的一般字符是" - ","_", "+"....但这些不是强制性的,所以你可以使用任何不应该在URL中的角色.
请避免%,&,},{,],[,/,>,<作为URL空间字符替换,因为它们可能会在某些浏览器和平台上引发错误.
正如您所看到的,Stak溢出本身使用' - '字符作为空格(%20)替换.
有一个快乐的质疑.
有人可以指向RFC,指示必须编码带空格的URL吗?
URI和RFC因此在RFC 3986中定义.
如果你看一下那里定义的语法,你最终会注意到空格字符永远不能成为语法上合法的URL的一部分,因此术语"带空格的URL"本身就是一个矛盾.