为什么URL区分大小写?


54

我的问题:最初设计URL时,为什么要区分大小写?我之所以这样问,是因为我(即一个外行)似乎不希望使用大小写不敏感来防止不必要的错误并简化已经很复杂的文本字符串。

另外,区分大小写的URL是否有真正的目的/优势(与大写字母指向同一页面的大多数URL相对,无论大小写都相反)?

例如,维基百科是一个对字母大小写敏感的网站(第一个字符除外):

https://en.wikipedia.org/wiki/St ck_Exchange是DOA。


11
您显然不在Windows上运行IIS
John Conde

53
我认为itscrap.com,expertsexchange和whorepresents.com会希望更多的人使用区分大小写的名称。有关更多信息,请参见boredpanda.com/worst-domain-names
埃里克·塔

22
URL是在Unix系统上渲染的恐龙漫游地球时设计的,而Unix区分大小写。
托尔比约恩Ravn的安德森

11
Wikipedia尝试对主题标题使用正确的大写字母,并对常见差异使用重定向。例如。htmlhtm然后Html全部重定向到HTML。但重要的是,由于主题众多,因此可能存在多个页面,其中URL仅因大小写而不同。例如:LatexLaTeX
MrWhite

7
@ edc65不过了Kobi指出,部分的URL(特别是的路径区分大小写的-因此,不使该URL(作为一个整体)是否区分大小写?
MrWhite 2016年

Answers:


8

URL为什么不区分大小写?

我知道这看起来像是一个挑衅性的(和“魔鬼的拥护者”)类型的修辞问题,但我认为考虑一下很有用。HTTP的设计是通常称为“ Web浏览器”的“客户端”向“ Web服务器”询问数据。

发布了很多很多不同的Web服务器。Microsoft已经发布了带有Windows Server操作系统(以及其他操作系统,包括Windows XP Professional)的IIS。Unix具有像nginx和Apache这样的重量级人物,更不用说像OpenBSD的内部httpd或thttpd或lighttpd之类的较小产品了。此外,许多具有网络功能的设备都内置了可用于配置设备的Web服务器,包括具有特定于网络目的的设备,例如路由器(包括许多Wi-Fi接入点和DSL调制解调器),以及其他设备,例如打印机或可能具有网络连接性的UPS(电池支持的不间断电源设备)。

因此,“为什么URL区分大小写?”这个问题问,“为什么Web服务器将URL区分大小写?” 实际的答案是:他们并没有做到这一点。至少一台相当流行的Web服务器通常不区分大小写。(Web服务器是IIS。)

不同Web服务器之间行为不同的一个关键原因可能归结为简单性。制作Web服务器的简单方法是按照与计算机/设备的操作系统定位文件相同的方式进行操作。很多时候,Web服务器会定位文件以提供响应。Unix是针对高端计算机设计的,因此Unix提供了允许使用大写和小写字母的理想功能。Unix决定将大写和小写区别对待,因为它们是不同的。那是要做的简单自然的事情。Windows由于希望支持已经创建的软件而具有不区分大小写的历史,而这种历史可以追溯到DOS,后者根本不支持小写字母,可能是为了使用功能更强大的计算机使用更少的内存来简化操作。由于这些操作系统不同,因此结果是,简单设计的Web服务器(早期版本)反映了相同的差异。

现在,在所有背景下,这里是针对特定问题的一些具体答案:

最初设计URL时,为什么要区分大小写?

为什么不?如果所有标准Web服务器均不区分大小写,则表明该Web服务器遵循该标准指定的一组规则。根本没有规则说该案需要被忽略。没有规则的原因仅仅是因为没有理由要有这样的规则。为什么要麻烦制定不必要的规则?

我之所以这样问,是因为我(即一个外行)似乎不希望使用大小写不敏感来防止不必要的错误并简化已经很复杂的文本字符串。

URL是为机器处理而设计的。尽管人们可以在地址栏中输入完整的URL,但这并不是预期设计的主要部分。预期的设计是使人们遵循(“单击”)超链接。如果普通的普通人这样做,那么他们真的不在乎看不见的URL是简单还是复杂。

另外,区分大小写的URL是否有真正的目的/优势(与大写字母指向同一页面的大多数URL相对,无论大小写都相反)?

William Hay的答案的第五点提到了一个技术优势:URL可能是Web浏览器向Web服务器发送一些信息的有效方法,如果限制较少,则可以包含更多信息,因此区分大小写限制将减少可包含的信息量。

但是,在许多情况下,区分大小写并没有超级引人注目的好处,事实是IIS通常不会对此加以干扰,这证明了这一点。

总而言之,最令人信服的原因可能是对于那些设计Web服务器软件的人来说只是简单,尤其是在区分大小写的平台(例如Unix)上。(HTTP并没有影响Unix的原始设计,因为Unix明显比HTTP古老。)


“不同Web浏览器之间行为不同的一个关键原因可能归结为简单性。” -我假设您是在这里和其他几个地方使用“ Web服务器”,而不是“ Web浏览器”?
MrWhite

2
更新。审查了每个“浏览器”案例,并进行了多次替换。感谢您指出这一点,以便提高质量。
TOOGAM '16

1
从历史到技术,我已经收到几个很好的答案。我犹豫不决,接受较低评分的答案,但是@TOOGAM的答案对我最有帮助。这个答案是彻底而广泛的,但它以一种我能理解的简单,对话的方式解释了这个概念。而且我认为此答案是对更深入的解释的很好的介绍。
凯尔(Kyle)

74

URL不区分大小写,仅一部分。
例如,URL中不区分大小写https://google.com

参考RFC 3986-统一资源标识符(URI):通用语法

首先,在Wikipedia中,URL类似于:

 scheme:[//host[:port]][/]path[?query][#fragment]

(我删除了该user:password部分,因为它并不有趣并且很少使用)

方案不区分大小写

主机子组件不区分大小写。

路径组件包含数据...

查询组件包含非分层数据...

各个媒体类型可以在片段标识符语法中定义自己的限制或结构,以指定不同类型的子集,视图或外部引用

因此,schemehost不区分大小写。
URL的其余部分区分大小写。

为什么path区分大小写?

这似乎是主要问题。如果没有记录,
很难回答为什么要这样做,但是我们可以做出很好的猜测。
我从规范中选择了非常具体的报价,重点放在data上
让我们再次看一下URL:

 scheme:[//host[:port]][/]path[?query][#fragment]
 \____________________/\________________________/
        Location                 Data
  • 位置-位置具有规范形式,并且不区分大小写。为什么?可能是这样,您可以购买域名而不必购买数千个变体。

  • 数据-数据由目标服务器使用,应用程序可以选择其含义。使数据不区分大小写是没有任何意义的。该应用程序应具有更多选项,并且在规范中定义不区分大小写将限制这些选项。
    这对于HTTPS也是有用的区别:数据是加密的,但主机是可见的。

它有用吗?

区分大小写在缓存和规范URL方面有其陷阱,但是它肯定有用。一些例子:


1
“ URL不区分大小写。” /“ URL的其余部分区分大小写。” -这似乎是矛盾的吗?
MrWhite

8
实际上,该方案定义了URL其余部分的期望值。http:相关的方案意味着URL指向DNS主机名。DNS早在URL发明之前就不区分ASCII大小写。请参见第55页ietf.org/rfc/rfc883.txt
O.琼斯

3
很详细!我从历史的角度出发。最初,只有在您访问文件系统时,才需要区分大小写。否则,事实并非如此。但是今天,情况发生了变化。例如,参数和CGI最初不存在。您的答案是当前观点。我不得不奖励你的努力!您真的在挖这个!谁知道这会炸毁它?干杯!!
closetnoc

2
@ w3dk:这不是一个非常有趣的术语,但是您可以使用“区分大小写”来表示,“更改字符的大小写可以更改整个”,或者可以将其表示为“更改字符”。字符的情况总是会改变整体”。Kobi似乎在断言后者,他更喜欢区分大小写的意思是“大小写的任何变化都是重大的”,这当然不适用于URL。您更喜欢前者。这只是他们对大小写有多敏感的问题。
Steve Jessop

2
@ rybo111:如果用户键入example.com/fOObaR,则规范要求www.example.com上的服务器接收给定的路径“ / fOObaR”;对于服务器是否必须将其与“ / foOBaR”区别对待,这个问题没有提及。
超级猫

59

简单。操作系统区分大小写。Web服务器通常不在乎,除非它们必须在某个时候访问文件系统。这是Linux和其他基于Unix的操作系统执行文件系统规则的地方,在这种情况下,敏感度是主要部分。这就是IIS从来都不区分大小写的原因。因为Windows从不区分大小写。

[更新]

正如我所说的那样,注释中有一些强有力的论点(自删除以来),它们关于URL是否与文件系统有任何关系。这些论点变得热烈起来。相信没有关系是极短视的。绝对有!让我进一步解释。

应用程序程序员通常不是系统内部人员。我不是在侮辱。它们是两个独立的学科,当应用程序可以简单地调用OS时,就不需要系统内部知识来编写应用程序。由于应用程序程序员不是系统内部程序员,因此无法绕过OS服务。我之所以这样说,是因为这是两个独立的阵营,而且很少交叉。编写应用程序通常是为了使用OS服务。当然,很少有例外。

当Web服务器开始出现时,应用程序开发人员并未尝试绕过OS服务。有几个原因。第一,没有必要。第二,应用程序程序员通常不知道如何绕过OS服务。第三,大多数操作系统要么极其稳定,强大,要么极其简单,轻巧,不值得付出任何代价。

请记住,早期的Web服务器要么在大型主机或中型计算机上的DEC VAX / VMS服务器和当今的Unix(Berkeley,Ultrix以及其他)等昂贵的计算机上运行,​​然后不久就开始运行。轻型计算机,例如PC和Windows 3.1。当更现代的搜索引擎开始出现时,例如1997/8年的Google,Windows进入了Windows NT,而其他操作系统(例如Novell和Linux)也开始运行Web服务器。Apache是​​主要的Web服务器,尽管还有其他非常流行的诸如IIS和O'Reilly的服务器。当时他们都没有绕过OS服务。直到今天,所有Web服务器都可能没有。

早期的Web服务器非常简单。他们仍然是今天。Web服务器通过OS文件系统发出/通过硬盘驱动器上存在的HTTP请求发出的对资源的任何请求。

文件系统是相当简单的机制。当发出访问文件的请求时,如果该文件存在,则该请求将传递到授权子系统,如果被授权,则原始请求会得到满足。如果资源不存在或未被授权,则系统将引发异常。当应用程序发出请求时,将设置触发器并等待应用程序。响应请求后,将引发触发器,并且应用程序将处理请求响应。直到今天仍然如此。如果应用程序认为请求已得到满足,则该请求将继续;如果请求失败,则该应用程序将在其代码内执行错误条件;如果未处理,则死亡。简单。

对于Web服务器,假定发出了对路径/文件的URL请求,则Web服务器将采用URL请求(URI)的路径/文件部分,然后向文件系统发出请求,并且该请求可以满足或引发异常。然后,Web服务器处理响应。例如,如果找到了所请求的路径和文件并由授权子系统授予了访问权限,则Web服务器将照常处理该I / O请求。如果文件系统引发异常,则如果未找到文件,则Web服务器将返回404错误,如果未授权原因代码则返回403禁止。

由于某些操作系统区分大小写,并且这种类型的文件系统需要完全匹配,因此Web服务器请求的路径/文件必须与硬盘驱动器上存在的完全匹配。这样做的原因是简单的。Web服务器不会猜测您的意思。未经编程,没有计算机会这样做。Web服务器在接收到请求后便对其进行处理。如果直接传递给文件系统的URL请求的路径/文件部分与硬盘驱动器上的内容不匹配,则文件系统将引发异常,并且Web服务器将返回404 Not Found错误。

真的是那么简单的人。这不是火箭科学。URL的路径/文件部分与文件系统之间存在绝对关系。


1
我认为你的论点是有缺陷的。尽管Berners-Lee对于ftp URL区分大小写没有任何选择。他必须设计http URL。他可以将它们指定为仅US-ASCII,并且不区分大小写。如果有任何Web服务器只是将URL路径传递到文件系统,则它们是不安全的,URL编码的引入破坏了与它们的兼容性。假设在处理操作系统粉碎案例之前正在处理路径,这将很容易实现。因此,我认为我们必须将此视为设计决策,而不是实现的怪癖。
威廉·海伊

@WilliamHay这与Berners-Lee或网络设计无关。它与操作系统的限制和要求有关。我是一名退休的系统内部工程师。当时我在这些系统上工作。我确切地告诉您为什么URL区分大小写。这不是猜测。这不是意见。这是事实。我的回答有意简化。当然,在发出任何开放语句之前,可以进行文件检查和其他处理。结果是,到目前为止,是(!)Web服务器仍然部分不安全。
closetnoc

URL是否区分大小写与Web设计无关吗?真?权威的争论,然后是断言的争论。Web服务器或多或少直接将URL的路径部分传递给一个打开的调用,这是URL设计的结果而不是原因。服务器(或在FTP情况下为智能客户端)可能已向用户隐藏了文件系统的大小写敏感性。他们不这样做是设计决定。
威廉·海伊

@WilliamHay您需要放慢草斗的速度并重新阅读我写的内容。我是一名退休的系统内部工程师,为ARPA-Net等编写OS组件,协议栈和路由器代码。我曾与Apache,O'Reilly和IIS内部人员合作。您的FTP参数不能成立,因为出于相同的原因,至少主要的FTP服务器仍然区分大小写。我从来没有说过有关URL / URI的设计。我从来没有说过Web服务器传递的值是未经处理的。我确实说过,OS服务是常用的,文件系统需要完全匹配才能成功。
closetnoc

@WilliamHay请理解,您和我正在考虑多种用途。我在回答中所说的只是,对于某些操作系统,文件系统调用在设计上区分大小写。使用系统调用(大多数情况下使用)的应用程序仅限于执行OS规则-在这种情况下,区分大小写。绕过这一规则并非不可能。实际上,在某些情况下,虽然不切实际,但可能有些琐碎。我习惯性地绕过文件系统,我的工作是解读去kablooie由于某种原因或其他硬盘驱动器或分析数据库文件内部等
closetnoc

21
  1. URL声称是UNIFORM资源定位器,可以指向Web之前的资源。其中一些是区分大小写的(例如,许多ftp服务器),URL需要能够以合理直观的方式表示这些资源。

  2. 在寻找匹配项时(无论是在OS中还是在OS之上),不区分大小写都需要进行更多工作。

  3. 如果将URL定义为区分大小写,则各个服务器可以根据需要将它们实现为不区分大小写。反之则不成立。

  4. 在国际环境中,不区分大小写可能很重要:https//en.wikipedia.org/wiki/Dotted_and_dotless_I。RFC1738还允许使用ASCII范围以外的字符,只要它们已编码但未指定字符集。这对于将自己称为“万维网”的事情来说非常重要。将URL定义为不区分大小写将为bug打开很多范围。

  5. 如果您尝试将大量数据打包到URI中(例如Data URI),则在区分大小写的情况下可以打包更多数据


1
我敢肯定,URL历史上仅限于ASCII。因此,国际化不太可能是一个原始原因。Unix区分大小写的历史(OTOH)可能发挥了巨大作用。
derobert

虽然只能在URL RFC1738中使用未编码的ASCII子集,但明确指出可以使用ASCII范围以外的字符进行编码。如果不指定字符集,则不可能知道除了大小写以外哪些八位字节代表相同的字符。更新。
威廉·海伊

1
关于#4:实际上比这更糟。我用虚线和无点表示了一个更通用的原理,即使即使所有内容都是UTF-8(或其他一些UTF),也无法在不知道文本所属区域的情况下正确将其大写或小写。在默认语言环境中,大写拉丁字母I小写为小写拉丁字母i,在土耳其语中这是错误的,因为它添加了一个点(没有“土耳其大写无点I”代码点;您应使用ASCII代码点)。抛出编码差异,这从“非常困难”变为“完全难处理”。
凯文

5

我从博客中窃取了一个“新旧事物”的习惯,以“为什么会这样?”的形式来回答问题。提出反问“如果不是这样,世界会是什么样?”

假设我设置了一个Web服务器来为我自己的文件夹提供文档文件,以便我不在办公室时可以在电话上阅读它们。现在,在我的文档文件夹中,我有三个文件todo.txtToDo.txt并且TODO.TXT(我知道,但它是有意义的我,当我提出的文件)。

我想使用什么URL来访问这些文件?我想使用来以一种直观的方式访问它们http://www.example.com/docs/filename

假设我有一个脚本,可以将联系人添加到我的地址簿中,也可以通过网络进行添加。应该如何采用其参数?好吧,我想像这样使用它http://www.example.com/addcontact.php?name=Tom McHenry von der O'Reilly。但是,如果我没有办法按大小写指定名称,该怎么办?

如何区分Cat和CAT,文本和文本,乳胶和LaTeX的Wiki页面?我想,页面有歧义,但是我更喜欢得到我想要的东西。

但是无论如何,这一切都感觉像是在回答错误的问题。

我认为您真正要问的问题是:“为什么Web服务器404只是为了区分大小写,而当它们是计算机时,它们旨在简化生活,并且它们完全有能力找到至少最明显的大小写变化。我输入的网址行得通吗?”

答案是,尽管某些站点已经做到了这一点(更好的是,它们也检查了其他错别字),但是没有人认为值得更改网络服务器的默认404错误页面来做到这一点……但是也许他们应该这样做?


1
一些站点使用某种机制将任何查询转换为全部小写或一致的形式。在某种程度上,这很聪明。
closetnoc

不,他们不应该。可以并且经常在需要时添加此功能(例如,通过Apache中的模块)。由于默认行为(或更糟糕的是,不可变的行为)比相对罕见的破坏性更大,因此可以强加这种更改。有人必须手动输入主机名以外的URL的情况。有关为什么不这样做的一个很好的例子,请回忆一下Network Solutions从固定的DNS查询中“修复”不存在的域错误时的惨败。
SirNickity '16

@SirNickity没有人提出任何级别的不变性,并且在我使用过的每台Web服务器上都可以配置Web服务器错误页面。没有人建议使用30 *代码替换404,而是在错误页面上添加可人工点击的建议链接列表;域名是一个非常不同的主题,并且是不区分大小写的问题,并且在不同的安全上下文中;并且IIS已经自动“修复”(通过忽略)URI的路径或文件名部分的大小写差异。
Dewi Morgan

自1996年以来,Apache允许您使用mod_speling进行此操作。这似乎并不是一件很受欢迎的事情。Unix / Linux人们将不区分大小写作为规则,不区分大小写作为例外。
reinierpost

4

虽然以上答案是正确和良好的。我想补充一点。

为了更好地理解,应该了解Unix(Linux)与Windows服务器之间的基本区别。Unix区分大小写,而Windows不区分大小写。

HTTP协议是在1990年左右演变或开始实施的。HTTP协议是由CERN研究所的工程师设计的,在大多数时候,科学家使用的是Unix计算机,而不是Windows。

大多数科学家都熟悉Unix,因此他们可能受到Unix样式文件系统的影响。

Windows Server在2000年之后发布。在Windows Server成为流行的HTTP协议之前,它就已经很成熟并且规范已经完成。

这可能是原因。


2
“ Windows服务器在2000年之后发布。” Windows NT的3.1团队将与您在1993年NT 3.51在1995年不同意可能是在NT开始变得成熟和完善,足以支持关键业务服务器应用程序。
CVn

NT 3.51具有Win 3.1界面。Windows直到Windows 95才真正起飞,它花了NT 4.0来获得相同的接口。
托尔比约恩Ravn的安德森

迈克尔·科林(MichaelKjörling)表示同意。让我修改一下。
玛尼

1
@ThorbjørnRavnAndersen在服务器市场上,NT 3.51相当成功。在消费品/消费品市场上,直到Windows 2000(NT 5.0)才开始使NT系列产品开始受到广泛的关注。
CVn

实际上,WorldWideWeb最初是在基于Unix的系统上开发的,该系统具有区分大小写的文件系统,并且大多数URL直接映射到文件系统上的文件。
reinierpost

4

应该怎么读“为什么要这样设计?” 题?您是要对决策过程进行历史准确的说明,还是要问“为什么有人会这样设计?”?

很少有历史记录的帐户。有时,当在标准委员会中做出决定时,会有关于辩论进行方式的文献记录,但是在网络成立初期,一些人匆忙地做出了决定(在这种情况下,可能是TimBL本人做出的),因此基本原理不太可能被写下来。但是TimBL承认他在URL的设计上犯了错误-参见http://www.dailymail.co.uk/sciencetech/article-1220286/Sir-Tim-Berners-Lee-admits-forward-slashes-web-address -mistake.html

在早期,URL非常直接地映射到文件名,并且文件通常位于类Unix的计算机上,类Unix的计算机具有区分大小写的文件名。因此,我的猜测是,这样做只是为了实现实现的便利,而从未考虑过(对于最终用户)可用性。再有,在早期,用户都是Unix程序员。


最终用户也是Unix用户(不一定是程序员,而是高能物理学家等),因此他们也习惯于不区分大小写。
reinierpost

3

这与您在哪里购买域名无关,DNS不区分大小写。但是,用于托管的服务器上的文件系统是。

这并不是真正的问题,在* nix主机上相当普遍。只要确保您在页面上编写的所有链接都是正确的,就不会有问题。为了简化操作,我建议您始终以小写形式命名页面,这样在编写链接时就无需再次检查名称。


2

Closetnoc对操作系统是正确的。某些文件系统将相同的名称用不同的大小写视为不同的文件。

另外,区分大小写的URL是否有真正的目的/优势(与大写字母指向同一页面的大多数URL相对,无论大小写都相反)?

是。以避免重复的内容问题。

例如,如果您具有以下URL:

http://example.com/page-1
http://example.com/Page-1
http://example.com/paGe-1
http://example.com/PAGE-1
http://example.com/pAGE-1

并且他们都指向内容完全相同的页面,那么您将拥有重复的内容,并且我确定您是否拥有Google搜索控制台(网站站长工具)帐户,Google会向您显示。

在这种情况下,我建议您使用所有小写的URL,然后将其中至少包含一个大写字母的URL重定向到小写版本。因此,在上面的URL列表中,将所有URL重定向到第一个URL。


“是的,以避免重复的内容问题。” -但是似乎相反吗?URL区分大小写(这是搜索引擎对待它们的方式)的事实导致您提到的重复内容问题。如果URL普遍不区分大小写,则不会出现大小写不同的重复内容问题。page-1相同PAGE-1
MrWhite 2016年

我认为较差的服务器配置会导致出现重复内容。例如,RewriteRule ^request-uri$ /targetscript.php [NC]存储在.htaccess中的语句将匹配,http://example.com/request-uri并且http://example.com/ReQuEsT-Uri因为[NC]表示对一个正则表达式求值时大小写无关紧要。
迈克

1

区分大小写确实有价值。

如果有26个字母,则每个字母都有大写的能力,即52个字符。

4个字符具有52 * 52 * 52 * 52组合的可能性,等于7311616组合。

如果无法大写字符,则组合的数量为26 * 26 * 26 * 26 = 456976

52个字符的组合是26个字符的组合的14倍以上。因此,用于存储数据的Urls可以更短,并且可以通过较少的数据传输通过网络传递更多的信息。

这就是为什么您使用诸如https://www.youtube.com/watch?v=xXxxXxxX之类的网址看到youtube的原因

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.