带有斜杠的查询字符串是否有效?

9
由于与我们合作的联盟伙伴存在沟通问题,他们调用我们服务器的URL出现了混淆。
以下是他们应该在我们服务器上调用的URL:
 /AAAAAAAA/?b=CCCCCCC

不幸的是,它在他们的系统中被实现为这样

 ?b=CCCCCCC/AAAAAAA

我可以轻松解析组件,但我担心带有 / 的查询字符串参数实际上不是一个有效的URL。

/在URL中是否真的有效 - 或者我应该担心。在什么情况下,未编码的/可能会在查询字符串中引起问题。


2
我喜欢这个问题中URL中的“/”被解析出来的方式 :-) - Simon_Weaver
3个回答

12
根据2005年的RFC 3986: 统一资源标识符(URI):通用语法,查询组件中允许使用/。以下是查询字符串的BNF定义(在RFC 3986的附录A中)。
query         = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
规范说明:
  • 斜杠("/")和问号("?")字符可能表示查询组件内的数据
  • 由于查询组件通常用于以"key=value"对的形式携带标识信息,而且其中一个经常使用的值是对另一个URI的引用,所以有时为了可用性考虑,最好避免对这些字符进行百分号编码
相关问题: 查询字符串:查询字符串是否可以包含也包含查询字符串的URL?

2
这应该是正确的答案,因为RFC 3986是2396的替代品。 - Chris Garrett

2
尽管我从未遇到过问题,但根据RFC 2396的规定,它们在技术上是不允许的:

查询组件中,“;”,“/”,“?”,“:”,“@”,“&”,“=”,“+”,“,”和“$”这些字符都是保留字符。

但正如我所说...我从未遇到过任何问题。我认为这更多是旧浏览器的问题,但也许有人可以更详细地解释一下这会引起什么问题?

我有点意识到从技术上讲这是不允许的(出于显而易见的原因),但我认为这应该基本上没问题。话虽如此,我在想代理、旧浏览器、安全工具等是否会出现一些奇怪的问题。 - Simon_Weaver
@Simon - 我还没有发现任何副作用,但我使用它们通常非常具体,例如 Login?ru=Route/SubRoute/Category/45 - Nick Craver
好的,希望我们能安心一周。谢谢 - 令人惊讶的是,有人实际使用 '/' 找到了我的问题,如此之快! - Simon_Weaver
链接已失效。 - anvd

1

在URL的查询部分中,斜杠是一个“保留字符”,根据RFC 2396第3.4节,因此根据第2.2节,它必须进行编码。也就是说,查询部分可以包含%2F,但不应该包含/


但实际上会有什么东西会出问题吗?我想修复URL格式,但需要等待他们下一次构建,大约需要一周的时间。 - Simon_Weaver
@Simon 如果有人知道那个问题的答案,那一定是你。 - hobbs
它在Chrome或IE8中对我来说没问题,但也许在使用Mosaic 1.0的人那里会出问题呢?我不知道;-) - Simon_Weaver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接