myk*_*hal 51 url webserver parsing http query-string
虽然强烈建议(W3C源,通过维基百科)Web服务器支持分号作为URL查询项的分隔符(除了&符号),但似乎通常不会遵循.
例如,比较
http://www.google.com/search?q=nemo & OE = UTF-8
http://www.google.com/search?q=nemo ; OE = UTF-8
结果.(在后一种情况下,分号是,或者在撰写本文时,被视为普通的字符串字符,就像网址是:http://www.google.com/search?q = nemo %3B oe = utf-8)
虽然我尝试了第一个URL解析库,但表现良好:
>>> from urlparse import urlparse, query_qs
>>> url = 'http://www.google.com/search?q=nemo;oe=utf-8'
>>> parse_qs(urlparse(url).query)
{'q': ['nemo'], 'oe': ['utf-8']}
Run Code Online (Sandbox Code Playgroud)
接受分号作为分隔符的当前状态是什么,哪些是潜在的问题或一些有趣的注释?(从服务器和客户端的角度来看)
gei*_*ira 19
1999年的W3C建议书已经过时.根据2014 W3C建议书,目前的状态是分号现在是非法的参数分隔符:
要解码application/x-www-form-urlencoded有效载荷,应使用以下算法.[...]此算法的输出是名称 - 值对的排序列表.[...]
- 设字符串是在U + 0026 AMPERSAND字符(&)上严格分割字符串有效负载的结果.
换句话说,?foo=bar;baz意味着参数foo将具有该值bar;baz; 而?foo=bar;baz=sna应导致foo被bar;baz=sna(虽然在技术上非法的,因为第二个=应该逃到%3D).
Dan*_*llo 17
只要您的HTTP服务器和服务器端应用程序接受分号作为分隔符,您就应该好了.我看不出任何弊端.如你所说,W3C规范就在你身边:
我们建议HTTP服务器实现者,特别是CGI实现者支持使用";" 代替"&"来节省作者以这种方式逃避"&"字符的麻烦.
我同意Bob Aman的观点.W3C规范旨在使锚点超链接更容易使用看起来像表单GET请求的URL(例如http://www.host.com/?x=1&y=2).在这种情况下,&符号与系统冲突,用于字符实体引用,所有这些都以&符号开头(例如").因此,W3C建议Web服务器允许使用分号作为字段分隔符而不是&符号,以便更容易编写这些URL.但是这个解决方案要求编写者记住,&符号必须被某些东西替换,并且a ;是一个同样有效的字段分隔符,即使Web浏览器在提交表单时普遍使用URL中的&符号.记住用&这些链接替换&符号可能会更加困难,正如文档中其他地方所做的那样.
更糟糕的是,在所有Web服务器都允许分号作为字段分隔符之前,URL编写者只能对某些主机使用此快捷方式,并且必须&用于其他主机.如果给定主机停止允许使用分号分隔符,他们还必须稍后更改其代码.这肯定比简单使用更难&,这将永远适用于每个服务器.这反过来又消除了Web服务器允许分号作为字段分隔符的任何动机.当每个人都在改变&符号&而不是;?时,为什么还要烦恼?