大家都知道,正常情况下来说,这个referer
是浏览器自动发送的,除了系统杀毒软件可以拦截referer
之外。正常的用户,都不能修改referer
来源页信息。但是在某些特殊的情况下,确实需要隐藏referer
,那么是否有简洁容易的隐藏来源页地址的方案?
真假referer
referer
就是指来源页面。在编程的世界里面,它还有另外一种拼写方式,就是:referrer
。两者的差别就是一个r
字母。那么谁对谁错呢?目前来看,两者都对。因为单词拼写上来说,referrer
是正确的拼写方式。但是referer
已经广泛使用于各种编程语言当中,是事实上的标准。所以,两者都不能说有错。
referer
这个错误的拼写方式,首次出现于1990年代的HTTP1.0
协议中。当发现这个拼写错误的时候,这种写法已经被四处普及。所以在后来的HTTP1.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.)
目前,大多数情况下,都是使用的referer
。只有在宿主环境为浏览器的语言中,还在坚持正确的拼写法方式referrer
。所以,大家除了写客户端js
或者html
的时候,需要注意一下,就好了。
控制referer
一般可以在html
页面的meta
区域,添加如下类似代码。
<meta name="referrer" content="never" />
Plain textCopy
其中的content
字段内容,会有较大的变化。那么常见的取值如下,下列图表中,左侧是经典取值。右侧是最新的标准。两者任选一种方式即可。
never | no-referrer |
default | no-referrer-when-downgrade |
always | unsafe-url |
origin-when-crossorigin | origin-when-cross-origin |
方案一:整体隐藏referer
那么对于本文的初始目的,隐藏referer
来说,这个可能的备选方案就是下面的两个了。
<meta name="referrer" content="never" />
Plain textCopy
<meta name="referrer" content="no-referrer" />
Plain textCopy
在添加了上述meta
的页面中,点击(跳转)任何页面,下一级页面都不会收到referer
。
方案二:通过服务器端发送特定header,隐藏referer
这个方案中,苏南大叔就不设置meta
了。直接用php
做例子,发出类似信息。
header("Referrer-Policy: no-referrer");
PHPCopy
方案二:特定元素隐藏referer
这个方案其实很不常见,但是真实有效。那就是针对特殊的dom
元素,设置是否传递referer
。
a
和link
标签可以通过属性rel
指定noreferrer
,仅对当前链接有效。注意写法:noreferrer
,不是no-referrer
。a
、area
、link
、iframe
和img
还可以通过referrerPolicy
进行设置。写法就是referrerPolicy="never"
或者referrerPolicy="no-referrer"
。注意,这里的policy
的P
是大写的。这个是标准写法!否则特殊情况下,不会生效的。
这里有个很邪恶的作用,苏南大叔就不明说了。大家试试吧。