Apache 实现资源防盗

一、什么是防盗链?#

有时候,你的网站莫名其妙的访问量变大,不要高兴的太早,有可能是被别人盗链了。

举个例子:比如你搭了个 discuz 论坛,里面有些热点图片、视频;然后别人将他网站上访问图片的地址重定向到你的 discuz 上,这样他的服务器就可以空闲出来了;也就是说别人访问他网站的图片视频,消耗的确是你服务器的资源;

盗链是指在自己的页面上展示一些并不在自己服务器上的内容。通常的做法是通过技术手段获得它人服务器上的资源地址,

绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容。

比较常见的是一些小站盗用大站的资源(图片、音乐、视频),

对于这些小站来说,通过盗链的方法可以减轻自己服务器的负担,因为真实的空间和流量均是来自别人的服务器。

对大站造成的影响确实徒徒增加了服务器压力,用户、流量还不是自己的。

二、如何防止盗链#

针对 Apache 进行盗链配置

模拟三个虚拟域名,分别到两个不同的站点中去

image

a 域名下有一张图片

image

b 域名进行盗链

image

在未配置防盗链之前,b 站点的这个图片是能够加载到 b 站点的,实质上耗费的流量是 a 站点的

现在开始对 a 站点做防盗链配置

两种方式

第一种方式在虚拟主机的配置文件中加入如下代码:

image

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://a.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://a.com$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.a.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.a.com$ [NC]
RewriteRule .*\.(gif|jpg|swf|png)$ http://www.c.com/error1.jpg [R,NC]

注:相关选项的解释

1.RewriteEngineOn #启用 rewrite,要想 rewrite 起作用,必须要写上

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

3.[NC] 指的是不区分大小写,[R] 强制重定向 redirect

4. 字母 L 表示如果能匹配本条规则,那么本条规则是最后一条 (Last),忽略之后的规则

注:相关配置的解释

1.RewriteCond %{HTTP_REFERER}!^$ 上面这一行意在允许空 “HTTP_REFERER” 的访问,即允许用户在浏览器地址栏中直接输入图片地址时图片文件的显示。

2.RewriteCond %{HTTP_REFERER} !benet.com/.*$[NC]

RewriteCond %{HTTP_REFERER} !www.benet.com/.*$ [NC]

设置允许访问的 HTTP 来源,包括网站自身。

3.RewriteRule .*.(gif|jpg|swf)$http://www.benet.com/about/p_w_picpath.png[R,NC,L]

定义被盗链时替代的图片,让所有盗链 jpg、gif、swf 等文件的网页,显示网页文档根目录下的 about/p_w_picpath.png 文件。注意:替换显示的图片不要放在设置防盗链的目录中,并且该图片文件体积越小越好。当然你也可以不设置替换图片,而是使用下面的语句即 可:RewriteRule.*.(gif|jpg|png)$ - [F]

注:[F] (强制 URL 为被禁止的 forbidden), 强制当前 URL 为被禁止的,即,立即反馈一个 HTTP 响应代码 403 (被禁止的)。

此时访问 a 站点,图片正常显示,b 站点则显示的是禁止防盗链的提示图片

b 站点显示结果

image

a 站点显示结果

image

注意:在测试的时候由于浏览器只对同一张图片加载一次,也就是说第一次出来后浏览器就直接记录住了,所以在测试的时候先刷新盗链站点查看最新结果,在刷新本站点查看结果即可,或者使用两个不同的浏览器进行测试则无需考虑缓存问题

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。