我注意到

HTTP://STACKOVERFLOW.COM/QUESTIONS/ASK

and

http://stackoverflow.com/questions/ask

两者都可以工作-实际上前一个转换为小写字母。

我认为这对用户来说是有意义的。

如果我看谷歌,那么这个URL工作正常:

http://www.google.com/intl/en/about/corporate/index.html  

但是这个带ABOUT的不能用:

http://www.google.com/intl/en/ABOUT/corporate/index.html   

URL是否应该区分大小写?


当前回答

问题是url是否应该区分大小写?

我认为区分大小写的URL没有用处,也没有很好的实践。这很愚蠢,很糟糕,应该在任何时候都避免。

只是为了支持我的观点,当有人问什么URL,你怎么解释URL的字符是大写还是小写?这是无稽之谈,没有人会告诉你不是这样的。

其他回答

url应该不区分大小写,除非有很好的理由说明它们不应该区分大小写。

这不是强制性的(它不是RFC的任何一部分),但它使url的通信和存储更加可靠。

如果我在网站上有两页:

http://stackoverflow.com/ABOUT.html

and

http://stackoverflow.com/about.html

它们有何不同?也许有人写的是“大喊风格”(大写)——但从IA的角度来看,这种区别永远不应该通过URL的变化来区分。

此外,在Apache中很容易实现这一点-只需从mod_spelling使用CheckSpelling On。

我不喜欢撞旧文章,但因为这是对这个特定问题的第一个回应,我觉得有必要澄清一些事情。

@Bhavin Shah回答说url的域名部分是不区分大小写的,所以

http://google.com 

and

http://GOOGLE.COM 

and

http://GoOgLe.CoM 

都是一样的,但域名部分之后的所有内容都是区分大小写的。

所以…

http://GOOGLE.COM/ABOUT

and

http://GOOGLE.COM/about

是不同的。

注意:我说的是“技术上”,而不是“字面上”在很多情况下,大多数情况下,服务器的设置处理这些项目相同,但也有可能设置他们,所以他们不处理相同。

不同的服务器处理方式不同,在某些情况下,它们必须区分大小写。在许多情况下,查询字符串值是被编码的(例如Session id或Base64编码的数据,作为查询字符串值传递)这些项本质上是区分大小写的,因此服务器在处理它们时必须区分大小写。

因此,要回答这个问题,服务器在获取这些数据时“应该”区分大小写吗?答案是“是的,绝对是”。

当然,并不是所有的内容都需要区分大小写,但是服务器应该知道区分大小写的含义以及如何处理这些大小写。


@Hart Simha的评论基本上说了同样的事情。在我发布之前我错过了它,所以我想在应得的地方给予赞扬。

URL字符被转换为十六进制代码(如果您注意到URL中的空格显示为%20等),由于小写字母和大写字母有不同的十六进制值,因此URL肯定是区分大小写的。然而,问题的精神似乎是,这应该是标准,我说不,但他们是。如果开发人员/提供商希望它能够为最终用户工作,那么他们就应该在代码中考虑到这一点。

情况下保存

url在客户端和服务器之间是保留大小写的。但是部分url可能区分大小写,也可能不区分大小写,这取决于服务器,原因有几个。

区分大小写

以下粗体部分的url可能是区分大小写的,这取决于站点和/或服务器配置。

http:// www。example.com / abc / def.ghi吗?. jkl = mno # pqr

用户@ example.com

基本原理

url中的大小写敏感有多种用途。主要是:

与区分大小写的文件系统的本机兼容性。 URL内更紧凑的数据编码,例如序列化、散列、id、永久链接和URL缩短器。

作为一名开发人员,我相信上述问题通常可以以更好的方式处理,但我也理解在某些情况下可能不允许这样做。

例如,假设一个现有产品需要在“GET”URL中放置大量数据,但它必须与所有主要服务器、浏览器和缓存/代理机制的最大URL长度兼容。为了适应中等长度的命令字符串(对于一些旧的浏览器来说小于1024个字符),您需要使用每个惟一的url安全字符(这基本上就是base64url编码)。

理想世界

url是否应该区分大小写是有争议的。我个人认为,为了简单起见,它们不应该是这样的(尽管它可能会创建更长的URL,但我们有百分数转义来轻松处理必须确保保存确切字符的情况,并且有其他方法可以在URL中传输数据)。

许多人似乎都同意这样一个事实,即许多流行的网站和服务都明确启用了不区分大小写的url,以提高可用性。最突出的例子是电子邮件地址的用户名部分。大多数电子邮件提供商会忽略大小写,有时甚至是点和其他符号(比如“j.smith@example.com”和“JSMITH@example.com”一样)。尽管根据规范,电子邮件用户名默认情况下是区分大小写的。

然而,事实是,不管我或其他人想要什么,这就是事情目前的工作状态。虽然最终在全球范围内过渡到不区分大小写的URL标准当然是可能的,但这可能需要相当长的时间,因为区分大小写目前在网络上被广泛用于各种目的。

最佳实践

就最佳实践而言,作为用户,您可以合理地在大多数情况下坚持使用小写字母,并期望事情能够正常工作。主要的例外是使用基于实例的编码的url或具有直接文件系统等价物的文档路径。然而,这种复杂的url通常是复制粘贴的(或简单地单击),而不是手动输入的。

作为一个web开发人员,你应该考虑让url尽可能不区分大小写。尽管如上所述,根据上下文,显然有一些难以避免的情况。

考虑以下几点:

https://www.example.com/createuser.php?name=Paul%20McCartney

在这个假设的示例中,HTML表单(使用GET方法)将“name”参数发送给创建新用户帐户的PHP脚本。

我在这个例子中要强调的一点是,这个GET参数需要区分大小写,以保留“McCartney”的大写字母(或者,作为另一个例子,保留“Walter d’isney”,因为还有其他方法可以打破通常的大写字母规则)。

正是这样的情况指导了W3C的建议,即方案和主机不区分大小写,但之后的所有内容都可能区分大小写——这取决于服务器。通过标准强制不区分大小写将使上面的示例无法保留作为GET查询参数传递的用户输入的大小写。

但我想说的是,尽管这是法律条文中对此类案件的规定,但法律的精神是,在与案件无关的情况下,不区分案件。然而,这些标准并不能告诉你什么情况下大小写无关紧要,因为,就像我给出的例子一样,这是一个与上下文相关的东西。

(例如,帐户用户名最好不区分大小写,因为“User123”和“User123”是不同的帐户,可能会令人混淆,即使他们的真实姓名,如上所示,最好是左区分大小写。)

有时是相关的,大多数时候不是。但这必须由服务器/ web开发人员来决定这些事情——不能由标准规定——因为只有在这个级别上才能知道上下文。

方案和主机是不区分大小写的(这显示了标准对不区分大小写的偏好,在这里它可以被普遍规定)。其余的由您自己决定,因为您更好地理解了上下文。但是,正如已经讨论过的,根据法律的精神,您可能应该默认不区分大小写,除非您有很好的理由不这样做。