一个 URL 中有多个问号是不是有效?

Posted

技术标签:

【中文标题】一个 URL 中有多个问号是不是有效?【英文标题】:Is it valid to have more than one question mark in a URL?一个 URL 中有多个问号是否有效? 【发布时间】:2011-02-24 20:00:24 【问题描述】:

我今天看到了以下网址:

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,然后在每个 = 处拆分它们的名称/值对。 【参考方案1】:

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

查询组件由 第一个问号(“?”) 字符并以数字结尾 符号 ("#") 字符或结尾 URI。

...

字符斜线(“/”)和 问号(“?”)可能代表数据 在查询组件中。谨防 一些旧的,错误的 实现可能无法处理此类 数据正确时,它被用作 相对引用的基本 URI (第 5.1 节),显然是因为他们 无法区分查询数据和 查找时的路径数据 分层分隔符。然而,作为 查询组件通常用于 携带识别信息在 “key=value”对的形式和一个 常用值是参考 到另一个 URI,有时会更好 为了避免可用性 对这些字符进行百分比编码。

https://www.rfc-editor.org/rfc/rfc3986#section-3.4

【讨论】:

那么这是否意味着第一个查询参数被命名为“?blogid”而不是“blogid”?那可能很有趣... @GalacticCowboy - 是的,我也发生了同样的事情。你是对的 - Firebug 确认第一个查询参数实际上是?blogid。它实际上似乎是一个非必要参数,即页面提供相同的任何数量的问号,或者完全省略该参数。【参考方案2】:

作为切线相关的答案,foo?spam=1?&eggs=3 为参数spam 提供值1?

【讨论】:

是的。如果没有.htaccess 或类似的技巧。如果我们将foo 更改为script.php 并提出此请求script.php?spam=1?&eggs=3 然后var_dump($_GET) 显示array(2) ["spam"]=> string(2) "1?" ["eggs"]=> string(1) "3"

以上是关于一个 URL 中有多个问号是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章

仅带有参数(以问号开头)的链接/ href 是不是有效?

href=url?page=1 问号后面的参数能不能不在地址栏显示

怎么js代码取问号后面参数

微信小程序传参的参数中有问号 识别不了“?”(问号)后面的内容

vue路由url问号传参、新打开页面(1分钟解决)

从onclick到function到ajax的url问号传多个参数(更多的话以此类推)问题