referer

由于项目需要,我接触到了javascript中的referer. 在网上找资料的时候,发现有这两篇文章对referer写得蛮好的,现把它们转贴到下面,一起学习.

 

第1篇--(http://huxiong888.blog.163.com/blog/static/1344952201061501535775/)

Referrer的重要性

HTTP请求中有一个referer的报文头,用来指明当前流量的来源参考页。例如在www.sina.com.cn/sports/上点击一个链接到达cctv.com首页,那么就referrer就是www.sina.com.cn/sports/了。在Javascript中,我们可以通过 document.referrer来获取同样的信息。通过这个信息,我们就可以知道访客是从什么渠道来到当前页面的。这对于Web Analytics来说,是非常重要的,这可以告诉我们不同渠道带来的流量的分布情况,还有用户搜索的关键词等,都是通过分析这个referrer信息来获取的。

但是,出于各种各样的原因,有时候Javascript中读到的referrer却是空字符串。下面总结一下哪些情况下会丢失referrer。

Referrer丢失的几个场景

修改Location对象进行页面导航

Location对象是一个用于页面导航的非常实用的对象。因为他允许你只变更Url的其中一部分。例如从cn域名切换到com域名,其他部分不变:

window.location.hostname = "example.com";

但是,通过修改Location进行页面导航的方法,会导致在IE下丢失Referrer。

IE5.5+ 下返回空字符串

Chrome3.0+,Firefox3.5,Opera9.6,Safari3.2.2均正常返回来源网页

window.open方式打开新窗口

示例:

<a href="#" onclick="window.open('http://www.google.com')">访问Google</a>

点击此链接会在新窗口打开Google网站,我们在地址栏中输入以下js代码就可以看到发送的referrer了。

javascript:alert(document.referrer)

测试结果:

IE5.5+ 下返回空字符串

Chrome3.0+,Firefox3.5,Opera9.6,Safari3.2.2均正常返回来源网页

如果是同个域名下通过此方式跳转的,那么我们可以通过访问windoww.opener对象去获取丢失的referrer信息。代码如下:

<script type="text/javascript">
    var referrer = document.referrer;
    if (!referrer) {
        try {
            if (window.opener) {
                // IE下如果跨域则抛出权限异常
                // Safari和Chrome下window.opener.location没有任何属性
                referrer = window.opener.location.href;
            }
        }
        catch (e) {}
    }
</script>

跨域的话则没辙了~

鼠标拖拽打开新窗口

鼠标拖拽是现在非常流行的用户习惯,很多浏览器都内置或者可以通过插件的方式来支持鼠标拖拽式浏览。但是通过这种方式打开的页面,基本全都丢失 referrer。并且,这种情况下,也无法使用window.opener的方式去获取丢失的referrer了。

已测试:

Maxthon2.5.2,Firefox的FireGesture插件,Chrome3.0+,Opera9.6,Safari3.2。

点击Flash内部链接

点击Flash上到达另外一个网站的时候,Referrer的情况就比较杂乱了。

IE下,通过客户端Javascript的document.referrer读取到的值是空的,但是如果你使用流量监控软件看一下的话,你会发现,实际上HTTP请求中的Referer报文头却是有值的,这可能是IE实现的Bug。同时,这个值指向的是Flash文件的地址,而不是来源网页的地址。

Chrome4.0下点击Flash到达新窗口之后,Referrer也是指向的Flash文件的地址,而不是源网页的地址。

Chrome3.0和Safari3.2是一样的,都是会丢失Referrer信息。

Opera则和Firefox一样,Referrer的值都是来源网页的地址。

HTTPS跳转到HTTP

从HTTPS的网站跳转到HTTP的网站时,浏览器是不会发送referrer的。这个各大浏览器的行为是一样的。

例如,我们在HTTPS下使用Google Reader或是Gmail的时候,点击某个链接去到另外一个网站,那么从技术上来说,这样的访问和用户直接键入网址访问是没有什么分别的。

Referrer丢失对于广告流量监控的影响

Referrer如果丢失,Web Analytics就会丢掉很重要的一部分信息了,特别对于广告流量来说,就无法知道实际来源了。目前国内好多用了Google Adsense广告的网站,都使用了window.open的方式来打开广告链接,因此IE下会丢失Referrer,而我们知道,IE是目前市场份额最大的浏览器,因此其影响是很大的。很多流量统计工具会因此将这部分流量归入“直接流量”,和用户直接键入网址等价了。

对于这样的情况,需要让广告投放者在投放广告的时候,给着陆页面的Url加上特定的跟踪参数。

例如,某个Flash广告,点击之后到达的网址是http://www.example.com/,为了监控此流量是从哪个渠道过来的,我们可以修改此投放的着陆Url,改成http://www.example.com/?src=sina,类似这种方式,然后在着陆页面中使用 Javascript代码提取此src参数,这样就可以得到广告来源信息。

在投放Google Adwords的时候,后台系统有一个“自动标记”的选项,当启用此选项的时候,Google在生成所有广告的着陆页面Url的时候,就会自动加上一个 gclid的参数,这个参数能够将Google Analytics后台和Adwords广告后台的数据进行整合。这样就可以知道广告流量对应于哪个广告系列,哪个广告来源和广告关键词等信息了。和上面提到的思路其实是类似的。只不过Google自动帮你做了Url的修改了而已。

 

第二篇--(http://blog.163.com/alex_kame/blog/static/14546748201072173718721/)

 

兼容IE和FF:获取Referer的JS方法

发现一个关于浏览器兼容的问题,当用JS 执行代码 window.location.href=”http://ityizhan.com” 来进行跳转的时候,Firefox 可以获取到到HTTP_REFERER页面,但是在IE中这一项为空,后来查了一些相关资料,发现在IE 中通过 window.location.href 或者是 是无法获取HTTP_REFERER, 真是搞不懂 IE 的浏览器,很多浏览器运行的很好的东西,它就是不支持,最后没有办法,只能PHP伪造来源HTTP_REFERER的方法或者用JS来伪造。
IE可以识别的 HTTP_REFERER 提交是通过click 触发的事件或者是 Form 表单提交的请求,下面是根据网上的资料总结的一个方法:
<script>
function referURL(url){
var isIe=(document.all)?true:false;
if(isIe) {
var linka = document.createElement(’a');
linka.href=url;
document.body.appendChild(linka);
linka.click();
}else {
window.location = url;
}
}

 

var url=“www.myposts.cn”
referURL(url);
</script>

这个方法先是用 document.all 来判断当前的浏览器是否是IE, 如果是的话就生成一个link,然后自动执行 onclick 事件,如果不是的话就用JS 跳转。这样在处理页面就可以得到 HTTP_REFERER 了

此方法在IE, Firefox, Safari , Chrome 测试通过

<think>好的,我现在需要帮用户解决如何在Nginx中配置和验证referer的问题。首先,我得回忆一下Nginx的相关模块,记得有一个ngx_http_referer_module模块是用来处理Referer校验的,对吧?用户提供的引用里也提到了这个模块,应该就是用它来实现防盗链和CSRF防护的。 接下来,用户的问题是如何配置和验证referer。根据引用内容,valid_referers指令是关键。需要明确valid_referers的不同参数,比如none、blocked、server_names,还有字符串和正则表达式。这些参数决定了哪些Referer是合法的。比如,none表示允许没有Referer的请求,blocked处理被防火墙或代理修改过的情况,server_names则匹配server_name中定义的域名。 然后,配置valid_referers之后,需要通过if语句判断$invalid_referer变量。如果为真,就返回403禁止访问。这部分需要注意Nginx的配置语法,尤其是if语句的使用位置,通常在location块里面。同时,用户提供的示例配置里有具体的代码,可以参考他们的结构,比如在location / 里面添加valid_referers和if判断。 另外,用户可能还需要了解如何测试配置是否正确。这时候可以用curl命令模拟不同的Referer,比如不带Referer头,或者带一个被允许的域名,或者被拒绝的域名,观察返回的状态码是否是403或者200。测试步骤对于验证配置是否生效很重要,应该包含在回答里。 用户提供的引用里还提到了实际应用中的配置建议,比如处理静态文件的location块,可能需要特别设置Referer校验。此外,还要注意valid_referers的顺序,因为Nginx是按顺序匹配的,一旦匹配到就不会继续检查后面的条件了。 还有一个问题是,用户可能对正则表达式的写法不太熟悉。比如在valid_referers中使用~\.csdn\.来匹配包含.csdn.的域名,需要注意转义字符和正则语法。这时候需要提醒用户正则表达式的正确写法,避免语法错误导致配置失效。 最后,应该总结一下配置步骤,分点说明,让用户更容易理解和操作。同时,生成的相关问题要围绕配置细节、参数含义、测试方法和应用场景,帮助用户进一步学习。</think>### 如何在Nginx中配置和验证Referer? #### 1. **核心模块与指令** Nginx通过`ngx_http_referer_module`模块实现Referer校验,主要用于防盗链和防止CSRF攻击。核心指令为`valid_referers`,用于定义合法Referer的规则,结合`$invalid_referer`变量判断请求是否合法[^1][^3]。 --- #### 2. **配置步骤** ##### (1) 定义合法Referer范围 在`location`块中使用`valid_referers`指令,参数支持以下类型: - `none`:允许缺失Referer头的请求(但存在Referer且不匹配时会被拦截)[^3]。 - `blocked`:允许Referer被防火墙或代理修改的请求(如部分截断的Referer)[^3]。 - `server_names`:匹配当前`server_name`配置的域名[^1][^3]。 - **字符串或正则表达式**:如`*.securitit.com`或`~\.csdn\.`(正则需以`~`开头)[^1]。 示例配置: ```nginx location / { valid_referers server_names *.securitit.com ~\.csdn\. blocked; if ($invalid_referer) { return 403; } # 其他处理逻辑 } ``` ##### (2) 拦截非法请求 若请求的Referer不在合法列表中,`$invalid_referer`变量值为`1`,可通过`if`语句返回`403`状态码[^3]。 --- #### 3. **实际配置示例** 以下是一个完整的防盗链配置,允许来自`securitit.com`域名、正则匹配`.csdn.`的请求,并兼容被代理修改Referer: ```nginx server { listen 80; server_name securitit; location / { valid_referers server_names *.securitit.com ~\.csdn\. blocked; if ($invalid_referer) { return 403; } return 200 "Valid Referer\n"; } } ``` --- #### 4. **验证与测试** - **测试合法请求**: ```bash curl -H "Referer: http://www.securitit.com" http://securitit # 输出:Valid Referer ``` - **测试非法请求**: ```bash curl -H "Referer: http://attacker.com" http://securitit # 输出:403 Forbidden ``` - **测试无Referer请求**: ```bash curl http://securitit # 输出:Valid Referer(因配置包含blocked参数) ``` --- #### 5. **注意事项** - **正则表达式语法**:需使用`~`开头,如`~\.csdn\.`匹配包含`.csdn.`的Referer[^1]。 - **性能优化**:避免在频繁访问的路径中使用复杂正则,可结合`location`块分离静态资源与动态请求[^2]。 - **与其他配置兼容**:若使用反向代理(如`proxy_pass`),需确保`proxy_redirect`等指令不冲突[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值