Referrer 还是Referer? | JerryQu 的小站
文章推薦指數: 80 %
为什么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
延伸文章資訊
- 1【Chrome 85 更新】淺談Referer-Policy 和更新影響 - MAX行銷誌
HTTP Referrer-Policy 是什麼? 二. Chrome 85 Referer-Policy 更新了什麼? 三. 為什麼要做這項變動? 四. 有什麼影響?
- 2Referer - HTTP - MDN Web Docs
The obsolete Content-Security-Policy referrer directive. Same-origin policy · Tighter Control Ove...
- 3HTTP參照位址- 维基百科,自由的百科全书
Referer的正确英语拼法是referrer。这是早期HTTP规范当中存在的拼写错误,后来为保持向下兼容将错就错。例如DOM Level 2、Referrer Policy等其他网络技术的规范...
- 4Referrer 还是Referer? | JerryQu 的小站
为什么JavaScript 里获取Referrer 要用document.referrer,PHP 里却是用HTTP_REFERER 呢?实际上HTTP 协议里的Referer 拼错了,而且从R...
- 5HttpRequestHeaders.Referrer 屬性(System.Net.Http.Headers)
public Uri? Referrer { get; set; } member this.Referrer : Uri with get, set. Public Property Refe...