标签 http_referer 下的文章

在哪些情况下 HTTP_REFERER 会为空

有时候我们需要获取当前页面的前一个页面信息,在PHP里面,通过$_SERVER['HTTP_REFERER']即可获取相关信息,配合使用parse_url()函数,可以切割网址单独获取各部分信息。但referer并非总是有效的,有几次这个问题困恼了我很久。

第一次碰到这个问题是因为浏览器原因导致,详情可参考我去年写的一篇文章:IE浏览器下HTTP_REFERER失效
第二次是因为给网站设置了https访问,但跳转的链接还是http。

通过查阅相关资料,总结了下面这些情形,HTTP_REFERER 有可能为空(失效):

  • 直接在浏览器地址栏输入网址访问
  • 通过浏览器书签点击访问网站
  • 在一个外部应用程序中点击链接访问
  • 从 https 链接跳转到 http 链接
  • 从 https 链接跳转到 另一个不同的 https 链接
  • 服务器安装了诸如firewall、antivirus等安全软件,将referer过滤掉了
  • 使用了过滤 referer 的代理服务器
  • 通过诸如curl等程序访问网站,但未设置referer头
但需要注意的是,完全信任 HTTP_REFERER 是不推荐的,不仅因为该变量容易失效或为空,更在于该变量很容易被伪造。

IE浏览器下HTTP_REFERER失效

后端语言:PHP。

由于功能需求,后端需要判断链接的http_referer值,PHP保存在 $_SERVER['HTTP_REFERER']中。但经过测试,IE浏览器(包括IE7-IE11)下该值为空,谷歌、火狐等均能正常获取。页面链接是通过window.open(url)的方式打开的。

后得知,IE浏览器只有通过a链接或者form表单提交的方式才能获取到HTTP_REFERER,所以有了下面的解决方案,大致就是先判断浏览器是否是IE浏览器,如果是,就模拟a链接点击跳转到指定页面,如果不是,就使用正常方式跳转。

代码如下:

    // document.all 方法ie11不支持,所以不能简单通过 (document.all) ? true : false 来判断
    function isIE() { //ie?
        if (!!window.ActiveXObject || "ActiveXObject" in window)
            return true;
        else
            return false;
        }

    function referURL(url){
        var isIe=isIE();
        if(isIe) {
           var linka = document.createElement('a');
           linka.href=url;
           linka.target="_blank";
           document.body.appendChild(linka);
           linka.click();
         } else {
             window.open(url);
          }
    }