HTTP referer

    技术2026-09-22  7

    HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。

    Referer其实应该是英文单词Referrer,不过拼错的人太多了,所以编写标准的人也就将错就错了。

    我的问题 我刚刚把feed阅读器改变为Gregarius,但他不像我以前用的liferea,访问新浪博客的时候,无法显示其中的图片,提示“此图片仅限于新浪博客用户交流与沟通”,我知道,这就是HTTP Referer导致的。

    From https to http 我还发现,从一个https页面上的链接访问到一个非加密的http页面的时候,在http页面上是检查不到HTTP Referer的,比如当我点击自己的https页面下面的w3c xhtml验证图标(网址为http://validator.w3.org/check?uri=referer),从来都无法完成校验,提示:

    No Referer header found!

    原来,在http协议的rfc文档中有定义:

    因为源连接可能是私有信息,或者是可能泄露其它私有信息源,强烈建议用户能够选择是否发送referer域。例如,浏览器客户端可能有切换选项来公开、匿名浏览,讲相应的允许、发送refererfrom信息。

    如果通过安全协议传输,客户端不应该在http请求中包括referer域。但是咱们的NTA是包括的。

    Firefox中关于Referer的设置 都在里,有两个键值:

    network.http.sendRefererHeader (default=2) 设置Referer的发送方式,0为完全不发送,1为只在点击链接时发送,在访问页面中的图像什么的时候不发送,2为始终发送。参见Privacy Tip #3: Block Referer Headers in Firefox

    network.http.sendSecureXSiteReferrer (default=true) 设置从一个加密页访问到另外一个加密页的时候是否发送Referer,true为发送,false为不发送。

    利用Referer防止图片盗链 虽然Referer并不可靠,但用来防止图片盗链还是足够的,毕竟不是每个人都会修改客户端的配置。实现一般都是通过apache的配置文件,首先设置允许访问的地址,标记下来:

    # 只允许来自csdn.net的访问,图片可能就放置在csdn.net网站的页面上 SetEnvIfNoCase Referer "^http://www.csdn.net/" local_ref # 直接通过地址访问 SetEnvIf Referer "^$" local_ref

    然后再规定被标记了的访问才被允许:

    <FilesMatch ".(gif|jpg)"> Order Allow,Deny Allow from env=local_ref </FilesMatch>

    或者

    <Directory /web/images>    Order Deny,Allow    Deny from all    Allow from env=local_ref </Directory>

    最新回复(0)