65

是否可以在请求标头中删除或隐藏 http referer 信息?我想使用可能在 javascript python 或 django 中的脚本从我的站点中删除访问其他站点的用户的 http 引荐来源信息

例子:

Host    slogout.espncricinfo.com
User-Agent  Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.0    
Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8    
Accept-Language en-us,en;q=0.5    
Accept-Encoding gzip, deflate    
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7    
Connection  keep-alive
Referer http://slogout.espncricinfo.com/index.php?page=index&level=login
4

11 回答 11

122

截至 2015 年,这是您防止发送 Referer 标头的方式:

只需将其添加到网页的头部:

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

这适用于链接和页面上 JavaScript 代码发出的Ajax 请求。

其他有效meta选项包括:

<meta name="referrer" content="unsafe-url" />
<meta name="referrer" content="origin" />
<meta name="referrer" content="no-referrer-when-downgrade" />
<meta name="referrer" content="origin-when-cross-origin" />

• 在此处查看它是否适用于您的浏览器:http: //caniuse.com/#feat=referrer-policy

• 在此处查看规范:http ://w3c.github.io/webappsec/specs/referrer-policy/

另请注意,浏览器现在发送包含域和端口的Origin标头(带有 CORS 请求和 POST 请求,请参见此处:https ://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin ),以及,据我所知,无法删除。如果您使用<meta name="referrer" content="origin" />引荐来源网址将包含与标题类似的信息Origin,这从隐私的角度来看已经很好,因为它会隐藏用户所在的确切页面。

更新:

如果您只想通过使用 JavaScript 来删除引荐来源网址,您可以在发出 Ajax 请求之前动态添加适当的元标记。此 JavaScript 将添加<meta name="referrer" content="no-referrer" />到网页的 head 部分:

var meta = document.createElement('meta');
meta.name = "referrer";
meta.content = "no-referrer";
document.getElementsByTagName('head')[0].appendChild(meta);
于 2015-08-14T16:02:31.373 回答
11

Javascript中有一个跨浏览器解决方案,它使用Iframes动态创建,检查概念证明(免责声明:它使用我为此目的编写的一个小JS库)。

于 2012-10-05T10:57:56.540 回答
6

如果您只对隐藏完整 URL 感兴趣并且不介意公开您的域名,那么这个小的 Javascript 代码就可以完成这项工作。

您的用户在example.com/secret_url_we_want_to_hide,您的用户单击了应该将他们发送到的链接google.com。但我们用这个代替<a href="http://google.com">Go to Google</a>:

a href="http://example.com/redirect.html#http://google.com">Go to Google</a>

包含以下内容的 HTML 页面在哪里/redirect.html:(编辑:请参阅更新!)

<html><head></head><script>
window.location.replace(location.hash.substring(1));
</script></html>

Google.com 将http://example.com/redirect.html在引荐来源标签中看到,而永远不会看到实际的example.com/secret_url_we_want_to_hide.

更新:

Firefox 有 location.hash 的错误,解决方法如下:

<html><head></head><script>
workaround_hash=location.href.split('#').splice(1).join('#');
window.location.replace(workaround_hash);
</script></html>
于 2014-08-29T19:01:20.170 回答
4

有多种机制可以做到这一点,具体取决于您使用的浏览器版本。对于任何浏览器,如果目标是通过 HTTP,您可以通过重定向到 HTTPS 页面来“清洗”源,然后导航到目标页面。

对于 IE,您可以使用 JavaScript(例如 window.open)执行导航,这将抑制引用。或者您可以使用 META Refresh,但要付出一定的代价。对于基于 WebKit 的浏览器,请参阅 NoReferrer LINK REL 选项:http ://www.webkit.org/blog/907/webkit-nightlies-support-html5-noreferrer-link-relation/

于 2011-07-25T14:55:06.370 回答
2
<meta name="referrer" content="no-referrer"/>

如果您将上述代码放在页面上,所有传出链接(用户点击)都不会发送推荐人信息

文档

于 2018-11-22T12:24:58.990 回答
1

我一直在寻找类似的解决方案,将引荐来源设为空白,但仅计算来自引荐网站的唯一访问次数。我遇到的问题是,如果有人从特定链接访问我的网站,访问计数器会上升,但如果那个人刷新页面,访问计数器仍然会上升。

我使用 google 访问了有关此主题的多个资源,是的,在有人指出我查看 php.net 以寻求解决方案之前,很难找到答案。

我在使用中找到了解决方案

header('Refresh: 0; url=index.php');

但只是上面的代码不是解决方案。解决方案在于它的位置。这是完整的代码:

$ref=@$_SERVER[HTTP_REFERER];
$domain = parse_url($ref, PHP_URL_HOST);

If ($domain === "google.com") 
    {
        header('Refresh: 0; url=index.php'); //Resets header info to host site so that on page refresh, the hit counter does not
    }                                        // increase but increases only when someone visits from google url again

在“刷新”之后,标题信息变为主机站点的标题信息,因此在页面刷新时“if”语句将无效并且命中计数器不会增加。

您可以将命中计数器放在 IF 块内。您还可以编程不同的参数来记录对您网站的空白点击,以及不同的参数来记录所有页面加载/页面浏览量。

希望能帮助到你.....

于 2015-04-28T02:48:57.640 回答
0

您假设通过 javascript 访问 Referer 标头是不可能的。就像 http 中的 User-Agent 标头一样,javascript 无法访问referer 等。这些标头的值由浏览器提供。如果需要,您可以做一些棘手的工作。

于 2011-07-25T20:07:02.807 回答
0

我没有看到任何答案提到还有一个设置策略的 HTTP 响应标头Referrer-Policy。以下是在 Apache 中设置它的方法:

Header add Referrer-Policy "no-referrer"

或者,在访问仅指向同一站点的链接时,发送引荐来源网址的选择可能较弱但仍然安全:

Header add Referrer-Policy "same-origin"
于 2020-12-26T23:52:06.940 回答
-1

还有另一种方法是使用history.replace() 方法隐藏查询字符串,例如,如果要http://example.com/search?q=100替换为http://example.com/search,可以这样做:

history.replace(null,null,'search')

希望这可以帮助!:D

于 2017-11-28T15:30:03.633 回答
-3

你不能。浏览器决定是否发送推荐人。您可以做的是使用链接匿名器隐藏您的引用者。

于 2011-07-25T14:32:52.773 回答
-4

我也在寻找解决方案,幸运的是找到了这个隐藏我的推荐人网站。让我印象深刻的是它甚至适用于 https > https 请求。

它将生成一个您可以使用的链接,该链接将完全符合您的要求。

于 2017-02-27T20:28:43.237 回答