<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>OurApache &#187; Referer</title>
	<atom:link href="http://ourapache.com/archives/tag/referer/feed" rel="self" type="application/rss+xml" />
	<link>http://ourapache.com</link>
	<description>我们致力于一个Apache知识的分享网站</description>
	<lastBuildDate>Tue, 13 Apr 2010 05:18:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>HTTP Referer二三事</title>
		<link>http://ourapache.com/archives/294</link>
		<comments>http://ourapache.com/archives/294#comments</comments>
		<pubDate>Wed, 02 Sep 2009 05:29:10 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[HTTP相关知识]]></category>
		<category><![CDATA[Referer]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=294</guid>
		<description><![CDATA[简言之，HTTP Referer是header的一部分，当浏览器向web服务器发送请求的时候，一般会带上Referer，告诉服务器我是从哪个页面链接过来的，服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里，他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。]]></description>
			<content:encoded><![CDATA[<h3>什么是HTTP <a href="http://ourapache.com/archives/tag/referer" class="st_tag internal_tag" rel="tag" title="标签 Referer 下的日志">Referer</a></h3>
<p>简言之，HTTP Referer是header的一部分，当浏览器向web服务器发送请求的时候，一般会带上Referer，告诉服务器我是从哪个页面链接过来的，服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里，他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。</p>
<p>Referer其实应该是英文单词Referrer，不过拼错的人太多了，所以编写标准的人也就将错就错了。</p>
<h3>我的问题</h3>
<p>我刚刚把feed阅读器改变为<a href="http://gregarius.net/">Gregarius</a>，但他不像我以前用的liferea，访问新浪博客的时候，无法显示其中的图片，提示“此图片仅限于新浪博客用户交流与沟通”，我知道，这就是HTTP Referer导致的。</p>
<p>由于<a href="http://www.ourapache.com/wp-admin/294">我上网客户端配置的特殊性</a>，首先怀疑是squid的问题，但通过实验排除了，不过同时发现了一个<a href="http://wiki.noreply.org/noreply/TheOnionRouter/SquidProxy">Squid和Tor、Privoxy协同使用的隐私泄露问题</a>，留待以后研究。</p>
<h3>Gregarius能处理这个问题么？</h3>
<p><a href="http://forums.gregarius.net/comments.php?DiscussionID=448">答案是否定的</a>，因为Gregarius只是负责输出html代码，而对图像的访问是有客户端浏览器向服务器请求的。</p>
<p>不过，安装个firefox扩展也许能解决问题，文中推荐的”Send Referrer”我没有找到，但发现另外一个可用的：”<a href="https://addons.mozilla.org/en-US/firefox/addon/953">RefControl</a>“，可以根据访问网站的不同，控制使用不同的Referer。</p>
<p>但是我不喜欢用Firefox扩展来解决问题，因为我觉得他效率太低，所以我用更好的方式——Privoxy。</p>
<h3>Privoxy真棒</h3>
<p>在Privoxy的default.action中添加两行：</p>
<blockquote><p>{+hide-referrer{forge}}<br />
.album.sina.com.cn</p></blockquote>
<p>这样Gregarius中新浪博客的图片就出来了吧？+hide-referrer是Privoxy的一个过滤器，设置访问时对HTTP Referer的处理方式，后面的forge代表用访问地址当作Refere的，还可以换成block，代表取消Referer，或者直接把需要用的Referer网址写在这里。</p>
<p>用Privoxy比用Firefox简单的多，赶紧换吧。</p>
<h3>From https to http</h3>
<p>我还发现，从一个https页面上的链接访问到一个非加密的http页面的时候，在http页面上是检查不到HTTP Referer的，比如当我点击自己的https页面下面的w3c xhtml验证图标（网址为<a href="http://validator.w3.org/check?uri=referer">http://validator.w3.org/check?uri=referer</a>），从来都无法完成校验，提示：</p>
<blockquote><p>No Referer header found!</p></blockquote>
<p>原来，在<a href="http://www.ietf.org/rfc/rfc2616.txt">http协议的rfc文档</a>中有定义：</p>
<blockquote><p>15.1.3 Encoding Sensitive Information in URI&#8217;s</p>
<p>&#8230;</p>
<p>Clients SHOULD NOT include a Referer header field in a (non-secure)<br />
HTTP request if the referring page was transferred with a secure<br />
protocol.</p></blockquote>
<p>这样是出于安全的考虑，访问非加密页时，如果来源是加密页，客户端不发送Referer，<a href="http://support.microsoft.com/kb/178066">IE一直都是这样实现的</a>，<a href="http://kb.mozillazine.org/Network.http.sendSecureXSiteReferrer">Firefox浏览器也不例外</a>。但这并不影响从加密页到加密页的访问。</p>
<h3>Firefox中关于Referer的设置</h3>
<p>都在里，有两个键值：</p>
<ul>
<li>network.http.sendRefererHeader (default=2) 设置Referer的发送方式，0为完全不发送，1为只在点击链接时发送，在访问页面中的图像什么的时候不发送，2为始终发送。参见<a href="http://cafe.elharo.com/privacy/privacy-tip-3-block-referer-headers-in-firefox/">Privacy Tip #3: Block Referer Headers in Firefox</a></li>
<li>network.http.sendSecureXSiteReferrer (default=true) 设置从一个加密页访问到另外一个加密页的时候是否发送Referer，true为发送，false为不发送。</li>
</ul>
<h3>利用Referer防止图片盗链</h3>
<p>虽然Referer并不可靠，但用来防止图片盗链还是足够的，毕竟不是每个人都会修改客户端的配置。实现一般都是通过apache的配置文件，首先设置允许访问的地址，标记下来：</p>
<blockquote><p># 只允许来自domain.com的访问，图片可能就放置在domain.com网站的页面上<br />
SetEnvIfNoCase Referer “^http://www.domain.com/” local_ref<br />
# 直接通过地址访问<br />
SetEnvIf Referer “^$” local_ref</p></blockquote>
<p>然后再规定被标记了的访问才被允许：</p>
<blockquote><p>&lt;FilesMatch “.(gif|jpg)”&gt;<br />
Order Allow,Deny<br />
Allow from env=local_ref<br />
&lt;/FilesMatch&gt;</p></blockquote>
<p>或者</p>
<blockquote><p>&lt;Directory /web/images&gt;<br />
Order Deny,Allow<br />
Deny from all<br />
Allow from env=local_ref<br />
&lt;/Directory&gt;</p></blockquote>
<p>这方面的文章网上很多，参考：</p>
<ul>
<li><a href="http://leftleg.hzpub.com/read.php?405">Apache 下防止盗链的解决办法</a></li>
<li><a href="http://blog.51766.com/page/zsc?entry=1144852732034">Apache的环境变量设置</a></li>
<li><a href="http://blog.soueasy.net/post/80.htm">配置 Apache 实现禁止图片盗链</a></li>
</ul>
<h3>不要使用Rerferer的地方</h3>
<p>不要把Rerferer用在身份验证或者其他非常重要的检查上，因为Rerferer非常容易在客户端被改变，不管是通过上面介绍的Firefox扩展，或者是Privoxy，甚至是libcurl的调用，所以Rerferer数据非常之不可信。</p>
<p>如果你想限制用户必须从某个入口页面访问的话，与其使用Referer，不如使用session，在入口页面写入session，然后在其他页面检查，如果用户没有访问过入口页面，那么对应的session就不存在，参见<a href="http://www.thescripts.com/forum/thread3090.html">这里的讨论</a>。不过和上面说的一样，也不要过于相信这种方式的“验证”结果。</p>
<p>个人感觉现在Rerferer除了用在防盗链，其他用途最多的就是访问统计，比如统计用户都是从哪里的链接访问过来的等等。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年07月14号 -- <a href="http://ourapache.com/archives/263" title="初识HTTP中的Referer">初识HTTP中的Referer</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/http" title="HTTP相关知识" rel="tag">HTTP相关知识</a>, <a href="http://ourapache.com/archives/tag/referer" title="Referer" rel="tag">Referer</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/294/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>初识HTTP中的Referer</title>
		<link>http://ourapache.com/archives/263</link>
		<comments>http://ourapache.com/archives/263#comments</comments>
		<pubDate>Tue, 14 Jul 2009 01:31:29 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[HTTP相关知识]]></category>
		<category><![CDATA[Referer]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=263</guid>
		<description><![CDATA[关于HTTP Referer使用非常简单，使用场合比较多的是用于页面统计、图片防盗链（可以在apache中进行设置，从非自己domain或空Referer过来的请求一律拒绝）等；但还是有一点值得注意：Referer是不安全的，客户端可以通过设置改变Request中的值，尽量不要用来进行安全验证等方面]]></description>
			<content:encoded><![CDATA[<p>这段时间的一个项目中需要记录PV级的用户访问信息，为了让这个功能实现尽量和现在系统代码少耦合，所以采用了在前端页面嵌入js的方案，被记录的信息中有一条就是：被访问页面的来源URL，也即从哪个页面跳转过来的；</p>
<p>HTTP Referer就是用来干这件事的，该值在服务端和客户端都能取到；服务端直接从request中读取，当然不同语言读取的方式不一样；客户端js的读取方式为document.referrer;</p>
<p>关于HTTP Referer使用非常简单，使用场合比较多的是用于页面统计、图片防盗链（可以在apache中进行设置，从非自己domain或空Referer过来的请求一律拒绝）等；但还是有一点值得注意：Referer是不安全的，客户端可以通过设置改变Request中的值，尽量不要用来进行安全验证等方面.</p>
<p>下面介绍下默认情况下Referer可能出现为空的场景：</p>
<p>1、页面从Https跳转到Http；应该是处于安全考虑，该点在RFC-2616中有说明；主流浏览器均遵守这个规则，比如IE、FF；但默认情况下Https到Https是会发送Referer的；</p>
<p>2、直接在浏览器中输入目标URL；</p>
<p>3、由于FF提供了很强大的自定义参数设置功能，所以我们可以通过about:config页面修改以下两个选项的默认设置：</p>
<p>network.http.sendRefererHeader (default=2)<br />
设置Referer的发送方式，0为完全不发送，1为只在点击链接时发送，在访问页面中的图像什么的时候不发送，2为始终发送。</p>
<p>network.http.sendSecureXSiteReferrer (default=true)<br />
设置从一个Https访问到另外Https页面的时候是否发送Referer，true为发送，false为不发送。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年09月2号 -- <a href="http://ourapache.com/archives/294" title="HTTP Referer二三事">HTTP Referer二三事</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/http" title="HTTP相关知识" rel="tag">HTTP相关知识</a>, <a href="http://ourapache.com/archives/tag/referer" title="Referer" rel="tag">Referer</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/263/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

