URL中包含多个问号是否有效?


91

我今天遇到了以下网址:

http://www.sfgate.com/cgi-bin/blogs/inmarin/detail??blogid=122&entry_id=64497

请注意,查询字符串开头的问号已加倍:

??blogid=122&entry_id=64497

我的浏览器似乎没有任何问题,可以运行一个快速书签:

javascript:alert(document.location.search);

刚刚给了我上面显示的查询字符串。

这是有效的网址吗?我之所以如此腐(假设我是)是因为我需要解析此类URL作为查询参数,并且支持双问号将需要对我的代码进行一些更改。显然,如果它们在野外,我需要为其提供支持。我主要是好奇我是不是完全不遵守URL标准,还是实际上是非标准URL,这是我的错。


幸运的是,尽管如此,我不需要更改代码。我过去一直indexOf()在查找问号,所以它拾取了第一次出现的位置。然后,我将query_parameters分别拆分&,然后将其名称/值对拆分=
Bungle 2010年

Answers:


107

是的,它是有效的。URL中只有 ?一个才有意义,之后的任何一个都被视为文字问号:

查询组件由第一个问号(“?”)字符指示,并由数字符号(“#”)字符或URI末尾终止。

...

斜杠(“ /”)和问号(“?”)可以表示查询组件中的数据。请注意,某些较旧的错误实现将其用作相对引用的基本URI时,可能无法正确处理此类数据(第5.1节),显然是因为它们在查找分层分隔符时无法将查询数据与路径数据区分开。但是,由于查询组件通常用于以“键=值”对的形式携带识别信息,并且一个经常使用的值是对另一个URI的引用,因此有时为了避免对这些字符进行百分比编码,这样做有时会更好。

http://tools.ietf.org/html/rfc3986#section-3.4


9
那么这是否意味着第一个查询参数被命名为“?blogid”而不是“ blogid”?那可能很有趣……
GalacticCowboy 2010年

3
@GalacticCowboy-是的,我也发生了同样的事情。您是正确的-Firebug确认第一个查询参数实际上是?blogid。它实际上似乎是一个非必需的参数,即该页面在页面上带有相同数量的问号,或者完全省略了该参数。
Bungle 2010年

26

作为与切向相关的答案,foo?spam=1?&eggs=3给参数spam赋值1?


是。如果没有.htaccess或类似的技巧。如果我们foo转到script.php并发出此请求,script.php?spam=1?&eggs=3var_dump($_GET)显示array(2) { ["spam"]=> string(2) "1?" ["eggs"]=> string(1) "3" }
Hebe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.