Referrer 还是Referer? | JerryQu 的小站

文章推薦指數: 80 %
投票人數:10人

为什么JavaScript 里获取Referrer 要用document.referrer,PHP 里却是用HTTP_REFERER 呢?实际上HTTP 协议里的Referer 拼错了,而且从RFC1945 一直错 ... May09,2015May09,20158CommentsReferrer还是Referer?文章目录HTTP中的ReferrerJavaScript中的Referrer其他标准中的Referrer结论提醒:本文最后更新于 2514 天前,文中所描述的信息可能已发生改变,请谨慎使用。

上回我写了一篇文章介绍「ReferrerPolicy」,有小伙伴看完后问我:Referrer这个单词到底怎么拼,为什么有时候中间有两个r,有时候只有一个? 是的,这是一个很有趣的问题,这里就给有疑惑的同学们科普下。

HTTP中的Referrer HTTP协议中有一个用来表示页面或资源来源的请求头,由PhilipHallam-Baker于上世纪90年代提出来,他当时把这个请求头叫做Referer,并最终写进了RFC1945,也就是HTTP/1.0协议: TheRefererrequest-headerfieldallowstheclienttospecify,for theserver'sbenefit,theaddress(URI)oftheresourcefromwhich theRequest-URIwasobtained.via 有趣的是,当时这个单词被他拼错了,正确的拼写应该是Referrer。

但是这个错误被发现之前,已经被大量使用,如果要改过来需要所有服务端、客户端的一致配合,还有大量的代码需要排查修改。

于是,HTTP的标准制定者们决定将错就错,不改了。

下面这段描述来自于RFC2616,也就是著名的HTTP/1.1协议: TheReferer[sic]request-headerfieldallowstheclienttospecify, fortheserver'sbenefit,theaddress(URI)oftheresourcefrom whichtheRequest-URIwasobtained(the"referrer",althoughthe headerfieldismisspelled.)via 可以看到HTTP/1.1的这一段描述中,相比HTTP/1.0,除了加上了对这个错误的说明之外,没有其他变化。

另外,那个[sic]是拉丁文里「原文如此」的意思。

很多其他标准在表述HTTP中的Referer请求头时,都会加上[sic],避免引起读者误解。

由此可见,HTTP标准制定者奉行实用主义,能用就行。

由于HTTP协议继续拼错,浏览器当然只好按错的来,服务端收到的也是拼错的,所以大部分WebServer、服务端语言或框架,都跟着拼错。

举几个例子: Nginx:ngx_http_referer_module-usedtoblockaccesstoasiteforrequestswithinvalidvaluesinthe"Referer"headerfield; PHP:$_SERVER['HTTP_REFERER']-Theaddressofthepage(ifany)whichreferredtheuseragenttothecurrentpage; Django:HttpRequest.META.HTTP_REFERER–Thereferringpage,ifany; ThinkJS:Controller.referer()-获取referer; JavaScript中的Referrer 这里说的JavaScript,都是针对宿主为浏览器的场景,获取到的referrer属性都是由浏览器提供的。

这一次,浏览器们比较齐心,都采用了正确的拼写方式,没有让这个错误在JavaScript中延续。

例如DOMLevel2里定义的document.referrer: ReturnstheURI[IETFRFC2396]ofthepagethatlinkedtothispage.Thevalueisanemptystringiftheusernavigatedtothepagedirectly(notthroughalink,but,forexample,viaabookmark).via 最新的FetchAPI中的Request接口,也有一个名为referrer的属性: Thereferrerattribute'sgettermustreturntheemptystringifrequest'sreferrerisnoreferrer,"about:client"ifrequest'sreferrerisclientandrequest'sreferrer,serialized,otherwise.via 更多关于FetchAPI的介绍可以查看月影大大翻译的这篇文章:这个API很“迷人”——(新的FetchAPI)。

其他标准中的Referrer 其他标准,例如ReferrerPolicy,也采用了正确的写法,并且明确表示不会兼容错误的拼写,例如在DeliveryviaCSP这一节写着: Note:ThedirectivenamedoesnotsharetheHTTPheader'smisspelling. 结论 HTTP请求中的Referer是一个典型的拼写错误,历史悠久,可以预见还会一直错下去,以后Referer变成一个专有名词也说不定。

所以一般涉及到读取HTTP请求头的场景,我们需要用Referer这种错误拼写;除此之外一般都要用Referrer这种正确的拼写。

本文链接:https://imququ.com/post/referrer-or-referer.html,参与评论»--EOF--发表于 2015-05-0917:29:52,并被添加「HTTP、Referrer」标签。

查看本文Markdown版本»本站使用「署名4.0国际」创作共享协议,相关说明»提醒:本文最后更新于 2514 天前,文中所描述的信息可能已发生改变,请谨慎使用。

专题「HTTP相关」的其他文章 »HTTPAlternativeServices介绍 (Aug21,2016)关于启用HTTPS的一些经验分享(三) (May05,2016)如何压缩HTTP请求正文 (Apr18,2016)HTTP协议中的Content-Encoding (Apr17,2016)三种解密HTTPS流量的方法介绍 (Mar28,2016)HTTPPublicKeyPinning介绍 (Mar05,2016)关于启用HTTPS的一些经验分享(二) (Dec22,2015)关于启用HTTPS的一些经验分享(一) (Dec04,2015)HTTP代理原理及实现(二) (Nov20,2015)HTTP代理原理及实现(一) (Nov20,2015)« ReferrerPolicy介绍9.9美元一年的VPS及配置指南 »Comments



請為這篇文章評分?