我的问题:最初设计URL时,为什么要区分大小写?我之所以这样问,是因为在我(即一个非专业人士)看来,不区分大小写是首选,以防止不必要的错误并简化已经很复杂的文本字符串。具有区分大小写的URL(相对于无论大小写都指向同一页面的绝大多数URL)的优势?例如,维基百科是一个对字母敏感的网站大小写(第一个字符除外):

https://en.wikipedia.org/wiki/StAck_Exchange为DOA。

评论

您显然不在Windows上运行IIS

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

URL是在Unix系统上渲染的恐龙漫游地球时设计的,而Unix区分大小写。

Wikipedia尝试对主题标题使用正确的大写字母,并对常见差异使用重定向。例如。 html,htm和HTML都重定向到HTML。但重要的是,由于主题众多,因此可能存在多个页面,其中URL仅因大小写而不同。例如:Latex和LaTeX

@ edc65但是Kobi指出URL的某些部分(特别是路径)区分大小写-因此,这是否会使URL(整体上)区分大小写?

#1 楼

该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浏览器”?

–怀特先生
16-2-23在18:06

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

– TOOGAM
16-2-24在0:47

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

–凯尔
16 Mar 5 '16 at 6:17

Windows具有不区分大小写的文件系统的原因是由于它具有DOS传统。 MS-DOS在Tandy TRS-80等计算机上开始使用,该计算机使用电视作为显示器,并且由于缺乏分辨率,最初不支持小写字母。由于它无法显示小写,因此不支持大小写混合。 MS-DOS已获得IBM的许可,成为原始PC-DOS。虽然原始PC可以显示小写字母,但文件系统是从MS-DOS照原样移植的。

–RichardP
20 Sep 20'2:29



#2 楼

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

不区分大小写。参考RFC 3986-统一资源标识符(URI):通用语法

首先,从Wikipedia来看,URL类似于:

很少使用)



user:password


方案不区分大小写


>

scheme


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





> host


路径组件包含数据...




path


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




query


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


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

host为什么区分大小写?很好的猜测。
我从规范中选择了非常具体的引号,重点放在数据上。
让我们再次看一下URL:
/>
位置-该位置具有规范形式,不区分大小写。
为什么?可能是这样,您可以购买域名而不必购买数千个变体。
数据-目标服务器使用数据,应用程序可以选择其含义。
使数据不区分大小写是没有任何意义的。该应用程序应具有更多选项,
并且在规范中定义不区分大小写将限制这些选项。
这也是HTTPS的一个有用区别:数据是加密的,但主机是可见的。

有用吗?缓存和规范的URL,但这肯定有用。
一些示例:




在数据URI中使用的Base64。
站点可以在URL中编码Base64数据,例如:http: //tryroslyn.azurewebsites.net/#f:r/A4VwRgNglgxgBDCBDAziuBhOBvGB7AOxQBc4SAnKAgczLgF44AiAUQPwBMBTDuKuYgAsucAKoAlADIBCJgG4AvkA

q <43 /> q <43区分“艾滋病”和“艾滋病”。


评论


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

–怀特先生
16-2-23在15:32

实际上,该方案定义了URL其余部分的预期内容。 http:和相关方案表示URL指向DNS主机名。 DNS早于URL的发明就不区分ASCII大小写。参见ietf.org/rfc/rfc883.txt的第55页

– O. Jones
16-2-23在15:33

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

– closetnoc
16-2-23在20:04

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

–史蒂夫·杰索普(Steve Jessop)
16-2-24在2:50



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

–超级猫
16年2月24日在16:33

#3 楼

简单。操作系统区分大小写。 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错误,如果未授权原因代码,则Web服务器将返回403 Forbidden。

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

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

评论


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

–威廉·海(William Hay)
16-2-29在10:38

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

– closetnoc
16-2-29在17:57

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

–威廉·海(William Hay)
16年1月1日在9:41

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

– closetnoc
16年1月1日在15:26

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

– closetnoc
16 Mar 1 '16 at 15:47

#4 楼


URL声称是UNIFORM资源定位符,可以指向网络之前的资源。其中一些是区分大小写的(例如,许多ftp服务器)
,URL必须能够以合理直观的方式表示这些资源。操作系统或更高版本)。
如果将URL定义为区分大小写,则各个服务器可以根据需要将它们实现为不区分大小写。反之则不成立。
在国际环境中,不区分大小写可能是不平凡的: RFC1738还允许使用ASCII范围以外的字符,只要它们已编码但未指定字符集。这对于将自己称为“万维网”非常重要。将URL定义为不区分大小写将为bug带来很大的范围。 。


评论


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

–德罗伯特
16-2-23在17:34



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

–威廉·海(William Hay)
16-2-24在8:33



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

–凯文
16-2-25在7:55



#5 楼

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

说我设置了一个Web服务器来为自己的文件夹提供文档文件,以便我可以阅读它们我不在办公室时打电话。现在,在我的documents文件夹中,我有三个文件,todo.txtToDo.txtTODO.TXT(我知道,但是当我制作文件时这对我来说很有意义)。使用,访问这些文件?我想使用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只是为了区分大小写,当它们是计算机时,为了简化生活,它们完全能够在我键入的URL中找到至少最明显的大小写变化会起作用吗?”

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

评论


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

– closetnoc
16-2-24在5:53

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

– SirNickity
16 Feb 25'0:38



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

– Dewi Morgan
16-2-26在15:07



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

– reinierpost
16-2-27在23:04



#6 楼

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

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

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

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

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

这可能是原因。

评论


“ Windows服务器在2000年之后发布。” Windows NT 3.1团队在1993年会与您意见相左。1995年的NT 3.51可能是NT开始变得成熟和完善以支持关键业务服务器应用程序的时候。

–用户
16-2-23在10:08



NT 3.51具有Win 3.1界面。 Windows直到Windows 95才真正起飞,它花了NT 4.0来获得相同的接口。

–索比昂·拉文·安德森(ThorbjørnRavn Andersen)
16-2-23在10:51

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

–马尼
16-2-23在10:58

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

–用户
16-2-23在15:17

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

– reinierpost
16年2月27日在22:57

#7 楼

人们应该如何读到“为什么要这样设计?”题?您是在要求决策过程中提供历史上准确的描述,还是在问“为什么有人会这样设计?”?

很少有可能获得历史上正确的描述。有时,当在标准委员会中做出决定时,会有关于辩论进行方式的文献记录,但是在网络初期,一些人匆忙地做出了决定(在这种情况下,可能是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
16-2-27在23:08



#8 楼

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

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

#9 楼

Closetnoc对操作系统是正确的。某些文件系统使用相同的大小写将相同的名称视为不同的文件。不论大小写都指向同一页面的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相同。

–怀特先生
16年2月23日在15:18

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

–迈克-不再在这里
16年2月24日在0:07

#10 楼

区分大小写确实有价值。

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

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

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

52种组合的组合超过14倍字符数要比26个字符大。因此,用于存储数据的Urls可以更短,并且可以通过网络传输更多的信息,而传输的数据却更少。 www.youtube.com/watch?v=xXxxXxxX