查询字符串键是否区分大小写?


Answers:


73

URI的RFC表示:

6.2.2.1。案例规范化

当URI使用通用语法的组件时,组件语法等效规则始终适用;也就是说,方案和主机不区分大小写,因此应规范化为小写。例如,URI等效于http://www.example.com/

除非该方案另有明确定义,否则其他通用语法组件均假定为区分大小写的(请参见第6.2.3节)。

请注意,方案(此处为“ http”),主机(服务器名称)不区分大小写,但无论如何都应小写。其余的区分大小写,除非您使用不同的方案明确表明它不区分大小写。

因此,根据规范,所有基于http的URI中的key和KEY都是不同的东西。

编辑:@Nicholas在假设权限定义了它接受的内容方面是部分错误的,这对于定义自己的URI的自定义方案和权限来说是正确的,但是http是每个人都遵循的定义明确的规范(或者您可以使用http查询例如,用竖线字符作为分隔符。想象一下那里的混乱!)

HTTPRFC规范说:

方案和主机不区分大小写,通常以小写形式提供;所有其他组件都以区分大小写的方式进行比较。除“保留”集中的字符外的其他字符等效于其百分比编码的八位字节:正常形式是不对其进行编码(请参阅[RFC3986]的2.1和2.2节)。

因此,规范中为HTTP方案定义的URI的查询部分区分大小写。如果Microsoft具有用于查询字符串的不区分大小写的解析器,则它不符合规范。并不是说我认为这种挑剔的程度确实很重要。


53

@gbjbaanb的答案不正确:RFC仅指定查询字符串的允许字符集。像URI的路径片段组件一样,查询URI组件仅对提供资源的授权机构有意义。

该内容是否区分大小写完全取决于该权限。

在C#和IIS的情况下,后备存储在解析的查询字符串HttpRequest对象是System.Collections.Specialized.NameValueCollection恰好是不区分大小写的(默认)。

由于该类提供了其他构造函数,因此允许提供不同的相等比较器,因此绝对没有什么可以阻止实现区分大小写的。

此外,由于页面本身(和客户端javascript)可以访问原始URI,因此他们可以随意使用它进行任何操作。

如果查询字符串是由于HTML表单提交而生成的,则键(名称)来自表单控件的值 name属性 HTML规范说该属性区分大小写。但是据我所知,没有人真正做到这一点。

因此,最终,您必须知道查询字符串中的请求处理程序期望什么。它可能(或可能不)区分大小写。


2
我正在查看旧版C#代码,试图理解为什么键被视为不区分大小写,并且您的回答很好地解释了这一点。+1
Marcel Lamothe 2015年

10

hurl.itkey将等于123KEY198。它们可以作为两个不同的查询字符串进行访问。


1
如果将语言更改为经典ASP怎么办。
ch.smrutiranjan parida 2014年

4
@ ch.smrutiranjanparida,语言选择与应该如何处理查询参数无关。是否使用COBOL,Perl,Erlang,Classic ASP,R,Java,Lisp都无关紧要。当然,解释查询字符串的库可能有错误,程序员可能会努力地使用小写的查询字符串(并且不应这样做),但是从URI的角度来看,如果大小写不同,它们也会有所不同。参见RFC接受的答案更多的细节。
亚伯

@Abel明白了。感谢您的输入。:)
ch.smrutiranjan parida 2015年

0

简而言之,在许多编程语言中,它们被视为相等。

URL的不同部分在区分大小写方面有所不同:

  • 协议(http)-不区分大小写
  • 主机名(example.com)-不区分大小写
  • 路径(/folder/document.html)-区分大小写
  • 查询字符串键(?fuzz = bar或?FUZZ = bar)-不区分大小写
  • 查询字符串值(?fuzz = bar&buzz = BAR)-区分大小写
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.