Apache中.htaccess防资源盗链

通过.htaccess禁止图片盗链

通过.htaccess禁止图片盗链

1. 为何要屏蔽盗链?


Apache 中的 .htaccess 文件(也叫”分布式配置文件”)是 Apache 中相当重要的配置文件,其格式为纯文本,它提供了针对目录改变配置的方法,通过在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录。

通过.htaccess文件,可以实现简单地很多在IIS中很繁琐甚至无法实现的功能,如密码保护、禁止显示目录列表、阻止/允许特定的IP地址、实现网址的301 重定向等。

正如上面所说,.htaccess文件将影响其所在的目录及其子目录,因此,如果我们要保护的内容位于网站内多个目录下,可以考虑将其放在根目录下;而如果图片有单独的子目录如“/images/”,则只需将其放置在该目录下。

通过.htaccess来防止网站的图片、压缩文件、或视频等非Html文件被盗链的方法相当简单,通过在.htaccess文件中加入几句命令即可保护我们宝贵的带宽。经过我的多次尝试,发现网上的教程大多有问题,而标准的用法介绍也是有些支支吾吾,这里总结下我的心得。

需要实现的目的:

  1. 对于本站及本站三级乃至多级域名都使用资源完全没有问题。
  2. 对于其他网站调用本站图片等资源,予以屏蔽。
  3. 屏蔽时给予返回图片或者转接。
  4. 有可能有一些资源就是需要外链的,需要允许。
  5. 直接访问资源是可以得到的,这一点主要是为了诸如插件调试、远程文件直接获取等其他获得资源方式的顺畅。

2. 防盗链代码


给出一个设计好的完整代码,向根目录下的 .htaccess 文件中写入(若没有,需新建):


RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{REQUEST_URI} !^/t/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http.*://heymu\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http.*://(.)+\.heymu\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !thuirsa\.org [NC]
RewriteCond %{HTTP_REFERER} !ikuaizi\.com [NC]
RewriteCond %{HTTP_REFERER} !zhuaxia\.com [NC]
RewriteCond %{HTTP_REFERER} !xianguo\.com [NC]
RewriteCond %{HTTP_REFERER} !google\.com [NC]
RewriteCond %{HTTP_REFERER} !bloglines\.com [NC]
RewriteCond %{HTTP_REFERER} !feedburner\.com [NC]
RewriteCond %{HTTP_REFERER} !feedsky\.com [NC]
RewriteRule .*\.(jpg|gif|png|bmp)$ t/warning.gif [L,NC]

说明一:需要Apache开启mod_rewrite模块,如果是虚拟主机,可以通过探针之类生成的phpinfo()查看是否已开启。

说明二:WordPress有可能自动生成了具有Rewrite的代码的.htaccess文件代码,则建议紧接 RewriteEngine On 一句之后加上上面代码中的 RewriteCond 与 RewriteRule 等几行代码。

3. 防盗链代码分析与解释




最外面的这一层是为了检验是否mod_rewrite打开了,如果没有打开就不会执行以下的代码。如果缺失本段代码,而恰恰Apache又没有安装此模块,则将会出现致命错误。本段代码在WordPress自生成的文件中已有。

RewriteEngine On

开启Rewrite功能,注意不要多次使用。本段代码在WordPress自生成的文件中已有。

RewriteCond %{HTTP_REFERER} !^$

这里是验证请求来源HTTP_REFERER,后面使用正则表达式来检测,本条将允许资源直接访问。

RewriteCond %{REQUEST_URI} !^/t/.*$ [NC]

这里是验证请求内容位置REQUEST_URI,本条允许访问/t/目录下的文件,你可以改成你喜欢的目录,用以外链。[NC]是表示大小写不分。

RewriteCond %{HTTP_REFERER} !^http.*://heymu\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http.*://(.)+\.heymu\.com/.*$ [NC]

这两句允许域名下或者域名子域名下的访问,同时包括http和https。

RewriteCond %{HTTP_REFERER} !thuirsa\.org [NC]
RewriteCond %{HTTP_REFERER} !ikuaizi\.com [NC]
RewriteCond %{HTTP_REFERER} !zhuaxia\.com [NC]
RewriteCond %{HTTP_REFERER} !xianguo\.com [NC]
RewriteCond %{HTTP_REFERER} !google\.com [NC]
RewriteCond %{HTTP_REFERER} !bloglines\.com [NC]
RewriteCond %{HTTP_REFERER} !feedburner\.com [NC]
RewriteCond %{HTTP_REFERER} !feedsky\.com [NC]

这里是针对需要开启的网站允许外链,比如自己的其他网站、google图片搜索、RSS订阅等……当然,也可以选择不允许。

RewriteRule .*\.(jpg|gif|png|bmp|css|js|swf)$ t/warning.gif [L,NC]

这里比较关键了,是选择需要防盗链的资源格式,然后选择转为某个地址,可以转为图片,也可以转为网站等,我这里就是转为t目录下的warning.gif文件。
warning

这里比较让我疑惑的地方就是关于后面操作选择,R表示转接,L表示终止匹配、结束返回,NC仍然还是不区分大小写的意思。网上很多资料都是用R,但是这里可能存在的一个问题就是R之后转接到的地址仍然会被这整个代码再次截获,从而一直不断请求,什么都显示不出。我的测试还是直接写[L,NC]为好,即使转接后的地址仍然属于防盗链范围仍然可以正常运行(貌似此时这里的转接后地址需要写为相对地址,未完全测试)。而更稳妥的方法还是上面所写的,把t目录索性就作为专门对外链接的目录。

4. 效果测试


这里需要一个综合测试,因为避免可能存在的错误,尤其是导致自己也无法正常使用资源。

测试一:自己的主网站及其子目录,包括HTTPS方式,显示图片没有问题。

测试二:主站三级域名下无问题。

测试三:授权的网站是否能够正常显示。

测试四:未授权的网站能够正常显示t目录下图片,正常显示其他目录下盗链后的警告图片。

测试五:直接访问图片能正常显示。

Apache防盗链测试

Apache防盗链测试

OK!大功告成!

PS:实验期间遇到一些问题,很多时候都不出效果,其中最后发现的一个bug是,上传.htaccess文件的时候曾经上传错了,将某个版本的文件上传到了image目录下,从而导致了无论外面怎么改,image目录下将同时遵守它“自己的规则”……

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*