22

在比较两个 URI 以确定它们是否匹配时,客户端
应该使用区分大小写的字节对整个
URI 进行逐个字节的比较,但以下情况除外:

我在Http Rfc中阅读了上面的句子我认为 Url 不区分大小写,但我不明白这意味着什么?

4

6 回答 6

35

RFC 3986指出:

方案和主机不区分大小写,因此应标准化为小写。例如,URI<HTTP://www.EXAMPLE.com/>等效于<http://www.example.com/>. 除非方案另有明确定义,否则假定其他通用语法组件区分大小写

RFC 2616为方案定义了以下比较规则HTTP

在比较两个 URI 以确定它们是否匹配时,客户端应该使用区分大小写的字节对整个 URI 进行逐个字节比较,但以下情况除外:

然而,RFC 7230进一步将其锁定为:

方案和主机不区分大小写,通常以小写形式提供;所有其他组件都以区分大小写的方式进行比较。

这些规则通常适用于客户端比较。没有专门针对服务器端比较的规则。一旦服务器将 URI 分解为其组件,它应该根据相同的规则处理它们,但我认为 RFC 中没有强制执行。一些 Web 服务器,如 Apache,确实遵循规则。IIS 没有,因为它与 Windows 不区分大小写的文件系统兼容。

于 2014-10-04T19:07:05.830 回答
14

实际上,它取决于 Web 服务器。

IIS 不区分大小写。

阿帕奇是。

我怀疑有关 IIS 的决定源于 Windows 文件系统不区分大小写这一事实。

IIS 仍然符合规范的那部分,因为应该是建议,而不是要求。

于 2013-03-26T16:01:28.467 回答
9

URI 的主机部分不区分大小写:

http://stackoverflow.com
http://StackOverflow.com

以上任何一项都会让您访问该站点。

主机部分之后的 URI 的其余部分可能区分大小写。这取决于服务器。

于 2013-03-26T16:11:14.957 回答
3

正如 Remy Lebeau 在回答中提到的,规则是为客户端设置的。实际上,这意味着客户端软件不应尝试对 URI 的所有部分进行任意大小写修改,除非有明确说明的部分。因此,当浏览器例如在页面锚点中看到相对 URL 时,不应该在检查它是否已经缓存在其缓存中之前将其转换为小写;它也不应该使用小写的 URI 来发布到服务器。此外,它不应该决定两个不同的 URI 仅指向相同的资源(因此可能错误地跳过事务并返回缓存的结果)。

这意味着客户端不应假设服务器如何处理 URI。它确实要求服务器处理某些不区分大小写的部分:例如,方案和主机。但除此之外,由服务器决定两个大小写不同的 URI 是否指向同一个资源。标准在这方面对服务器没有任何限制,除了直接规定外,没有“服务器应该”或“服务器不应该”。如果服务器决定它的 URI 不区分大小写,那绝对没问题。如果它们区分大小写,那也没关系。

于 2016-07-31T10:51:38.937 回答
2

URL 是否区分大小写也取决于 Web 服务器。例如,Microsoft IIS 服务器将 URL 视为区分大小写。

以下 URL(托管在 Microsoft IIS 服务器上)都被视为等效:

但是,Apache 服务器确实将 URL 视为区分大小写,这被归类为两种不同的资源:

从技术上讲,Apache 在这里正确地遵循了标准,而微软正在违反规范……哦,好吧——“旧习惯很难改掉,”他们说!

于 2014-10-04T18:30:01.833 回答
1

对于基于文件的 URI,区分大小写更多地取决于底层文件系统,而不是 Web 服务器。Apache 将很高兴在 Windows(FAT、NTFS)和 mac(HFS)上返回,但不适index.html用于INDEX.html区分大小写的文件系统,例如那些通常在 Linux 中使用的文件系统(extx 等)。

于 2015-08-17T01:05:15.133 回答