你在意过每天输入的网址是否区分大小写么?

letters.jpg

通常在浏览器地址栏输入的网址我们叫做URL(统一资源定位符:Universal Resource Locators)。先来看一个简单的URL:
http://www.example.com/here/is/path/file.html
这个URL可以简单的描述为:使用HTTP协议去www.example.com所在的机器上读取文件file.html这个文件。当然这是简单的去理解,更详细的解析可以看这里。从这个描述中可以看到,一个URL会被分成三部分,形如:[协议]://[域名]/[路径]。

  • 协议:最常见的就是HTTP跟HTTPS,除了这个还有FTP文件传输协议等,这里是不区分大小写的
  • 域名:域名(Domain Name)是需要通过域名系统(DNS)成功解析才能够正常访问到对应的IP地址,域名的命名规则之一就是:在域名中不区分大小写
  • 路径:路径部分是否区分大小写,则要看该网址对应的后台是如何实现的

只有路径部分才是会区分大小写。每个网站都有后台的服务器,如果服务器只是单纯的采用路径映射到机器的文件系统中,那不同的操作系统平台是会有不同的区别的:

  • Linux:常见的是采用第三/四代扩展文件系统(ext3/4),在该文件系统下是需要区分大小写的
  • Mac OS X: 使用的HFS / HFS + / APFS(2016年发布的macOS Sierra开始)文件系统是不区分大小写
  • Windows:微软公司开发的NTFS也是不区分大小写的

对于我们最经常接触到应用服务器来说,访问一个路径并不是指向文件系统中的某一个文件,而是作为一个字符串传输给应用服务器进行解析处理。

我这里用了Koa来做一个简单的测试,在URL的路径中输入大小写会出现什么情况。

const Koa = require('koa')
const app = new Koa()
const router = require('koa-router')()
router  
  .get('/', (ctx, next) => { ctx.body = `root path: ${ctx.req.url}`  })
  .get('/lowercase', (ctx, next) => {   ctx.body = `lowercase path: ${ctx.req.url}`  })
  .get('/UPPERCASE', (ctx, next) => { ctx.body = `uppercase path: ${ctx.req.url}` })
app.use(router.routes())
app.listen(3000)

👆上面的六种情况可以我们可以看到,path并没有区分大小写。

当我在地址栏输入:https://www.zhihu.com/EXPLORE 并没有成功跳转,而是出现了一个404页面,这里又是什么原因呢?

我们还是以刚刚Koa的那个为例子来看。在例子中,使用了koa-router这个中间件来解析路由,koa-router里面有个match方法对path解析,而这个match方法主要是调用了path-to-regexp来生成进行解析,最终正则成功匹配对应的路由进行访问相对应的资源。

下面看看没有使用类似koa-router这样的中间件,会是怎样的效果。

app.use((ctx, next) => {
  const path = ctx.req.url
  if (path === '/lowercase') {
    ctx.body = 'success to request lowercase resource'
  } else if (path === '/UPPERCASE') {
    ctx.body = 'SUCCESS TO REQUEST UPPERCASE RESOURCE'
  } else {
    ctx.body = `success to visit: ${path}`
  }
})

可以看到如果自己对path进行处理的话,是可以自己控制是否大小写敏感的。实际的运用中,为了易用性考虑,尽量满足不区分大小写,这应该也是router-koa这类中间件设计成case insensitive的考虑之一呱(猜的...hah)。知乎传说用的是Python的Tornado,而Tornado的路由采用正则直接匹配解析的,所以,访问https://www.zhihu.com/EXPLORE不成功应该是正则解析没有做到大小写不敏感吧(又是猜的...)

那在微博或者其他平台里面经常看得到这样的URL:http://t.cn/Ri98Hke 这是又是怎么一个情况呢?

这种一般叫做短链接,既然都叫短链接了,自然是希望越短越好啦,然而实际的操作中我们会发现,太短满足不了日益增长的业务需求(然而并没增长)吖,那太长了也不符合实际吖,我微博只给你发140个字符,你一个链接都40个字符了。所以,大小写敏感的话会使得尽可能短又尽可能多这么变态的需求。以微博七位短链路径为例,一起来看看(数字:10个,大写字母:26个,小写字母:26个)

  • case insensitive: (10 + 26)^7 = 78,364,164,096
  • case sensitive: (10 + 26 + 26)^7 = 3,521,614,606,208

所以短链还是大小写敏感方便一些。

其实在早两天遇到这个小问题之前我还是一直以为URL是严格区分大小写的。我个人觉得如果api或者网页提供给我们使用的时候,还是应该遵从api的命名规则去使用,尽管是大小写不敏感。

源码地址:CNBlackJ/caseSensitive
首发知乎专栏

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容