我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

大家都知道,正常情况下来说,这个referer是浏览器自动发送的,除了系统杀毒软件可以拦截referer之外。正常的用户,都不能修改referer来源页信息。但是在某些特殊的情况下,确实需要隐藏referer,那么是否有简洁容易的隐藏来源页地址的方案?请带着您的疑问,走进苏南大叔的本篇文章。

苏南大叔:如何隐藏来源页地址?referer-policy 对比讲解 - referer
如何隐藏来源页地址?referer-policy 对比讲解(图3-1)

真假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" />

其中的content字段内容,会有较大的变化。那么常见的取值如下,下列图表中,左侧是经典取值。右侧是最新的标准。两者任选一种方式即可。

neverno-referrer
defaultno-referrer-when-downgrade
alwaysunsafe-url
origin-when-crossoriginorigin-when-cross-origin

方案一:整体隐藏referer

那么对于本文的初始目的,隐藏referer来说,这个可能的备选方案就是下面的两个了。

<meta name="referrer" content="never" />
<meta name="referrer" content="no-referrer" />

在添加了上述meta的页面中,点击(跳转)任何页面,下一级页面都不会收到referer

方案二:通过服务器端发送特定header,隐藏referer

这个方案中,苏南大叔就不设置meta了。直接用php做例子,发出类似信息。

header("Referrer-Policy: no-referrer");

苏南大叔:如何隐藏来源页地址?referer-policy 对比讲解 - check_code
如何隐藏来源页地址?referer-policy 对比讲解(图3-2)

方案二:特定元素隐藏referer

这个方案其实很不常见,但是真实有效。那就是针对特殊的dom元素,设置是否传递referer

  • alink 标签可以通过属性 rel 指定 noreferrer,仅对当前链接有效。注意写法:noreferrer,不是no-referrer
  • aarealinkiframeimg 还可以通过 referrerPolicy 进行设置。写法就是referrerPolicy="never"或者referrerPolicy="no-referrer"。注意,这里的policyP是大写的。这个是标准写法!否则特殊情况下,不会生效的。
这里有个很邪恶的作用,苏南大叔就不明说了。大家试试吧。
newsn.net:这里是【评论】可见内容

方案对比代码

下面是两个测试文件,苏南大叔页不详细解释了。一切都在代码中,大家自己看。
index.php

<?php
//header("Referrer-Policy: no-referrer");
?>
<html>
    <head>
        <meta charset="UTF-8">
        <!--
        <meta name="referrer" content="never" />
        <meta name="referrer" content="no-referrer" />
        -->
    </head>
    <body>
        <a href="check.php">检测是否有referer1</a><br/>
        <a href="check.php" rel="noreferrer">检测是否有referer2</a><br/>
        <a href="check.php" referrer="no-referrer">检测是否有referer3</a><br/>
        <iframe src="check.php"></iframe><br/>
        <iframe referrerPolicy="no-referrer" src="check.php"></iframe><br/>
        <img src="img.php?1" width="200">
        <img src="img.php?2" referrerPolicy="no-referrer" width="200"><br/>
    </body>
</html>

check.php

<?php
header("Content-type: text/html; charset=utf-8");
echo "来源页是:".@$_SERVER["HTTP_REFERER"];
?>

img.php

<?php
$from = @$_SERVER["HTTP_REFERER"];
if($from==""){
    $img="null.png";
}
else{
    $img="ok.png";
}
header("content-type:image/png");
echo file_get_contents($img);
?>

上述index.php的排列组合很多,苏南大叔就不一一试验了。大家自己试试。

苏南大叔:如何隐藏来源页地址?referer-policy 对比讲解 - referer_img
如何隐藏来源页地址?referer-policy 对比讲解(图3-3)

newsn.net:这里是【评论】可见内容

总结

很简单的代码,但是效果却非常地显著。可以完全刷新大家对referer的认识。

更多referer的相关文章,请点击下面的链接查看。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   html5