HTTP Referer简介

在百度中搜索搜狐,点击链接进去,抓包信息如下:
 
GET http://www.sohu.com/ HTTP/1.1
 
Host: www.sohu.com
 
Connection: keep-alive
 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.4 (KHTML, like Gecko) Chrome/16.0.889.0 Safari/535.4
 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
 
Referer: http://www.baidu.com/s?tn=baidusite&word=�Ѻ�
 
Accept-Encoding: gzip,deflate,sdch
 
Accept-Language: zh-CN,zh;q=0.8
 
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
 
Cookie: www1=w:1; vjuids=26e753894.132e8ab7273.0.c409be1c; sci12=w:1; ent12=w:1; gn12=w:1; IPLOC=CN1200; SUV=1110092031152327; SOHUHOMETAB=visit:2; TurnAD9=visit:3; TurnADzs19=visit:1; TurnADzs20=visit:2; TurnAD351=visit:2; TurnAD119=visit:1; TurnAD118=visit:2; TurnAD10=visit:2; TurnAD120=visit:3; TurnAD11=visit:2; TurnAD414=visit:1; TurnAD415=visit:1; TurnAD349=visit:3; TurnADfankaniu=visit:2; TurnADab10e888e532c9887794784e83c9504c=visit:1; www0=w:1; FULL=w:1; COUPLET=w:1; tiyu11=w:1; tiyu12=w:1; vjlast=1318163543.1318741656.11
 
If-Modified-Since: Sun, 16 Oct 2011 05:01:04 GMT
 
其中红色部分就是访问www.sohu.com时,HTTP请求中的Referer,表示通过百度搜索关键字’搜狐’,点击链接跳转而来。
 
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
 
Referer其实应该是英文单词Referrer,不过拼错的人太多了,所以编写标准的人也就将错就错了。
 
关于HTTP Referer使用非常简单,使用场合比较多的是用于页面统计、资源防盗链等,但还是有一点值得注意的是:Referer是不安全的,客户端可以通过设置改变 Request中的值,尽量不要用来进行安全验证等方面。
 
Referer是不安全的,客户端可以通过设置改变 Request中的值,尽量不要用来进行安全验证等方面;下面介绍下默认情况下Referer可能出现为空的场景:
 
1、页面从https跳转到http,应该是处于安全考虑,该点在RFC-2616中有说明,主流浏览器均遵守这个规则,比如IE、FF;但默认情况下https到https是会发送Referer的。
 
2、直接在浏览器中输入目标URL。
 
3、由于FF提供了很强大的自定义参数设置功能,所以我们可以通过about:config页面修改以下两个选项的默认设置:network.http.sendRefererHeader (default=2),设置Referer的发送方式,0为完全不发送,1为只在点击链接时发送,在访问页面中的图像什么的时候不发送,2为始终发送。network.http.sendSecureXSiteReferrer (default=true),设置从一个Https访问到另外Https页面的时候是否发送Referer,true为发送,false为不发送。
 
4、从收藏夹访问。
 
5、单击’主页’或者自定义的地址
 
6、用js来window.open等方式打开(还有location.href,location.replace())。
 
在PHP中可以通过预定义变量$_SERVER获取HTTP的Referer,即:$_SERVER['HTTP_REFERER']。
 
Apache利用HTTP_Referer防盗链
 
Posted on 2011 年 10 月 16 日
 
呼叫中心企业后台管理系统和前台座席系统页面中都有通话记录录音的试听和下载功能,如何在用户试听和下载录音的时候不暴露录音地址或者录音地址不能被盗用呢?这就涉及到mp3,图片等资源的防盗链问题。
 
简单的,我们可以用HTTP请求header中的referer判断,只要referer是内部网站的地址或者可信任的地址,就可以访问相应资源。通过Apache的FilesMatch配置可以实现,在Apache的配置文件httpd.conf中加入:
 
SetEnvIfNoCase Referer “^http://www.example.com” local_ref=1
 
SetEnvIfNoCase Referer “^http://test.example.com” local_ref=1
 
<FilesMatch “\.(txt|doc|mp3|zip|rar|jpg|gif)”>
 
    Order Allow,Deny
 
    Allow from env=local_ref    #referer为www.example.com或test.example.com的请求
 
    Allow from 127.0.0.1          #本机地址
 
</FilesMatch>
 
其中SetEnvIf指令根据客户端的请求属性设置环境变量,SetEnvIfNoCase代表当满足某个条件时,为变量赋值,一般结合其他指令使用。
 
也可以使用正则表达式:
 
SetEnvIf Referer “^http://(.)+\.ilinux\.cn/” local_ref=1 
 
SetEnvIf Referer “^http://(.)+\.isql\.cn/” local_ref=1 
 
SetEnvIf Referer “^http://(.)+\.other\.org\.cn/” local_ref=1 
 
SetEnvIf Request_URI “/logo(.)+” local_ref=0 
 
<FilesMatch “\.(mp3|wmv|png|gif|jpg|jpeg|avi|bmp|ram|rmvb|rm|rar|zip|mp3)”> 
 
    Order Allow,Deny 
 
    Allow from env=local_ref 
 
</FilesMatch>

 

以上配置方式都还也写到.htaccess,使用.htaccess文件也会存在一些问题,比如性能。如果使用.htaccess文件,则Apache需要在每个目录中查找该文件,还必须在所有更高级的目录中查找它,另外,每次请求一个页面时,也都需要读取.htaccess文件。因此,允许使用.htaccess文件都会导致性能的下降。
 
例如,对/var/www/htdocs中页面的请求,Apache必须查找以下文件:
 
/.htaccess
 
/var/.htaccess
 
/var/www/.htaccess
 
/var/www/htdocs/.htaccess
 
总的来说,通过.htaccess来保护网站更为方便和灵活。
 
最后还可以用Apache的mod_rewrite模块等进行防盗链。

 

posted @ 2015-08-05 11:13  douglasvegas  阅读(1596)  评论(0编辑  收藏  举报