HTTP引用不总是被传递


HTTP Referer not always being passed

我有一个记录用户访问的应用程序。这些访问都不是直接访问的,这些访问100%是从另一个站点引用的。

我将$_SERVER['HTTP_REFERER']传递给数据库。大约35%的记录条目通过了引用,其余为空白。

这有什么原因吗?

HTTP_REFERER可能为空白的原因有几个。

  1. 你必须明白这是浏览器给出的一个环境变量。这意味着用户可以删除它,甚至改变它,如果他们愿意。
  2. 通过书签、历史记录或手动输入链接访问链接的用户没有引用者。
  3. IE也被认为在围绕javascript的情况下删除referer。如window.openwindow.location,甚至在锚定中设置target="_blank"meta refresh
  4. 在聊天应用程序(PDF/Word/Excel文档)中点击内嵌链接也不会设置推荐人。
  5. 使用AJAX, file_get_contents, fopen和其他类似的函数在其他语言中可能不会设置引用请求。
  6. cURL, fsockopen,有类似浏览器组件的应用程序可能不会设置引用。

可能还有更多的情况会发生这种情况,如果我能想到任何合理的情况,我会更新的。

如果用户直接访问您的网站,则没有推荐人。也有可能他们已经设置好了,所以他们的浏览器永远不会发送referrer。

根据这个答案,浏览器在进行元刷新时不一定发送一个referrer

浏览器有时会在请求中包含referer。但这不是强制性的(referer是100%自愿的)。实际上,围绕referer存在各种隐私和安全问题(例如,如果一个HTTPS站点指向一个HTTP站点,浏览器不应该将引用的站点包含为referer)。所以不要依赖它

当在Internet Explorer 4.0及更高版本中从一个文档链接到另一个文档时,当链接从HTTPS页面到非HTTPS页面时,Referer头将不会被发送。当链接来自非http协议(如file://)到另一个页面时,Referer头也不会被发送。更多信息请访问

  1. 直接访问您的页面(在地址栏或从书签,历史等输入URL)
  2. 浏览器设置(禁用引用或为空)
  3. 如果有人使用file_get_contents()函数请求页面内容…

这是常见的,当你被困在寻找为什么它失踪:-有时你的推荐人是https,而你在http上,它会丢失。

否则:—用户直接输入url访问。—用户已添加书签并来自书签。有时用户保留浏览器默认的url(类似于书签)-代理浏览可能会删除引用。-作为机器人访问网站(搜索引擎)

这也取决于传输层,我遇到了一个问题,我的消费者应用程序A在HTTP层上运行,而我发送请求的应用程序在HTTPS层上运行。