referer 是啥意思?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了referer 是啥意思?相关的知识,希望对你有一定的参考价值。
n. 推荐人,上线;介绍人 (其正确英语拼法是referrer,由于早期HTTP规范的拼写错误,为了保持向后兼容而将错就错)
网络意义:
referrer 网站来路;访问者进入 网站的任何途径。 HTTPReferrer是header的一部分,当浏览器向web服务器发出请求的时候,一般会带上Referer,告诉服务器用户从那个页面连接过来的,服务器藉此可以获得一些信息用于处理。
HTTP 协议中有一个用来表示页面或资源来源的请求头,由 Philip Hallam-Baker 于上世纪 90 年代提出来,他当时把这个请求头叫做 Referer,并最终写进了 RFC1945,也就是 HTTP/1.0 协议:
The Referer request-header field allows the client to specify, for the server's benefit, the address (URI) of the resource from which the Request-URI was obtained. via
有趣的是,当时这个单词被他拼错了,正确的拼写应该是 Referrer。但是这个错误被发现之前,已经被大量使用,如果要改过来需要所有服务端、客户端的一致配合,还有大量的代码需要排查修改。于是,HTTP 的标准制定者们决定将错就错,不改了。下面这段描述来自于 RFC2616,也就是著名的 HTTP/1.1 协议:
The Referer[sic] request-header field allows the client to specify, for the server's benefit, the address (URI) of the resource from which the Request-URI was obtained (the "referrer", although the header field is misspelled.) via
可以看到,相比 HTTP/1.0,HTTP/1.1 除了加上了对这个错误的说明之外,没有其他变化。另外,那个[sic] 是拉丁文里「原文如此」的意思。很多其他标准在表述 HTTP 中的 Referer 请求头时,都会加上[sic],避免引起读者误解。
由此可见,HTTP 标准制定者奉行实用主义,能用就行。由于 HTTP 协议继续拼错,浏览器当然只好按错的来,服务端收到的也是拼错的,所以大部分 Web Server、服务端语言或框架,都跟着拼错。举几个例子:
nginx:ngx_http_referer_module - used to block access to a site for requests with invalid values in the “Referer” header field;
php:$_SERVER['HTTP_REFERER'] - The address of the page (if any) which referred the user agent to the current page;
Django:HttpRequest.META.HTTP_REFERER – The referring page, if any;
ThinkJS:Controller.referer() - 获取 referer;
javascript 中的 Referrer
这里说的 JavaScript,都是针对宿主为浏览器的场景,获取到的 referrer 属性都是由浏览器提供的。这一次,浏览器们比较齐心,都采用了正确的拼写方式,没有让这个错误在 JavaScript 中延续。
例如 DOM Level 2 里定义的 document.referrer:
Returns the URI [IETF RFC 2396] of the page that linked to this page. The value is an empty string if the user navigated to the page directly (not through a link, but, for example, via a bookmark). via
最新的 Fetch API 中的 Request 接口,也有一个名为 referrer 的属性:
The referrer attribute's getter must return the empty string if request's referrer is no referrer, "about:client" if request's referrer is client and request's referrer, serialized, otherwise. via
更多关于 Fetch API 的介绍可以查看月影大大翻译的这篇文章:这个API很“迷人”——(新的Fetch API)。
其他标准中的 Referrer
其他标准,例如 Referrer Policy,也采用了正确的写法,并且明确表示不会兼容错误的拼写,例如在 Delivery via CSP 这一节写着:
Note: The directive name does not share the HTTP header’s misspelling.
结论
HTTP 请求中的 Referer 是一个典型的拼写错误,历史悠久,可以预见还会一直错下去。也许以后Referer 会变成一个专有名词也说不定。所以,一般涉及到读取 HTTP 请求头的场景,我们需要用Referer 这种错误拼写;除此之外一般都要用 Referrer 这种正确的拼写。
在JSP中获取REFERER的方式是:request.getHeader("REFERER"); 参考技术B 引用者
错误是啥意思? :“禁止(Referer检查失败 - 没有Referer。):”
【中文标题】错误是啥意思? :“禁止(Referer检查失败 - 没有Referer。):”【英文标题】:What does error mean? : "Forbidden (Referer checking failed - no Referer.):"错误是什么意思? :“禁止(Referer检查失败 - 没有Referer。):” 【发布时间】:2018-01-02 07:49:04 【问题描述】:我有一个网站正在运行,它似乎运行良好。然而,现在我第一次在日志中看到了这个错误。
Forbidden (Referer checking failed - no Referer.): /pointlocations/
[pid: 4143|app: 0|req: 148/295] 104.176.70.209 () 48 vars in 1043 bytes [Wed Jul 26 19:49:35 2017] POST /pointlocations/?participant=A2TYLR23CHRULH&assignmentId=3P4MQ7TPPYF65ANAUBF8A3B38A0BB6 => generated 2737 bytes in 2 msecs (HTTP/1.1 403) 1 headers in 51 bytes (1 switches on core 0)
发帖到 /pointlocations/
时会发生这种情况,但仅限于一个特定的人(每个 participant
对每个帐户都是唯一的,所以我知道只有一个人,反复遇到这个问题。超过 500 多个其他 participant
有过没有这样的问题/错误。
这个错误是什么意思,可能是什么原因造成的,我可以解决这个问题吗?
【问题讨论】:
Hoi Mitchell,你能解决这个问题吗?我正面临这样的问题,但无法确定原因。会不会是因为 HTTPS/SSL 问题? @QCaron。嘿。我没有故意解决它。我在应用程序的另一端工作了一段时间,它消失了。我想这与我正在做的事情有关,如果我没记错 CSRF 令牌的话。也许这会有所帮助。 github.com/Tivix/django-rest-auth/issues/164。如果您确实弄清楚了,请将其发布为答案。祝你好运。 就我而言,我遇到了支付平台调用的 POST 网络挂钩的问题。在生产中,使用 HTTPS,出现了与您相同的错误。可能你必须在这里使用 csrf_exempt 装饰器。您的视图是从第三方调用的,例如通过其他服务器/网站? @QCaron 是的。它被 AWS 上托管的 iframe 调用。 【参考方案1】:TLDR:尝试为您的视图使用 csrf_exempt 装饰器:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def my_webhook(request):
# Do some stuffs...
# Return an HHTPResponse as Django expects a response from the view
return HttpResponse(status=200)
只有在绝对需要避免潜在的安全漏洞时才应该这样做。
更多上下文:
我在开发由第三方调用的网络挂钩时遇到了类似的问题,这是一种支付解决方案。每次付款状态发生变化(例如从“开放”变为“已付款”)时,第三方都会调用该网络挂钩的 Django 视图来通知我们。
由于支付平台在请求POST中只提供了支付ID,所以不应该进行CSRF检查。 Django 允许您通过 csrf_exempt
装饰器来做到这一点。
【讨论】:
对 pythonanywhere.com 没有帮助 本机 django 管理视图会发生这种情况! 我正在使用会话身份验证,因此使用 csrf_exempt 不是我的解决方案。我现在该怎么办?以上是关于referer 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章