Nginx服务之防盗链功能

编程入门 行业动态 更新时间:2024-10-28 06:25:55

Nginx服务之<a href=https://www.elefans.com/category/jswz/34/1739346.html style=防盗链功能"/>

Nginx服务之防盗链功能

一:原理

盗链是一种损害原有网站合法利益,给原网站所在服务器造成额外负担的非法行为。要采取防盗链的措施,首先需要了解盗链的实现原理。 客户端向服务器请求资源时,为了减少网络带宽,提高响应时间,服务器一般不会一次将所有资源完整地传回给客户端。比如在请求一个网页时,首先会传回该网页的文本内容,当客户端浏览器在解析文本的过程中发现有图片存在时,会再次向服务器发起对该图片资源的请求,服务器将存储的图片资源再发送给客户端。在这个过程中,如果该服务器上只包含了网页的文本内容,并没有存储相关的图片资源,而是将图片资源链接到其他站点的服务器上去了,这就形成了盗链行为。

比如内网用户通过Internet访问域名为www.test这个服务器上的WEB服务,而该服务器没有存储图片资源,而是将图片链接到域名为www.fz服务器上,这就形成了盗链行为。这种情况下客户端请求图片资源实际上是来自其他的服务器。
要实现防盗链,需要了解HTTP协议中的请求头部的Referer头域和采用URL的格式表示访问当前网页或者文件的源地址。通过该头域的值,我们可以检测到访问目标资源的源地址。这样,如果我们检测到Referer头域中的值并不是自己站点内的URL,就采取组织措施,实现防盗链。
需要注意是,由于Referer头域中的值可以被更改的,因此该方法不能完全阻止所有盗链行为。

二:配置指令

Nginx配置中有一个指令valid_referers,用来获取Referer头域中的值,并且根据该值的情况给Nginx全局变量$invalid_referer的值,如果Referer头域中没有符合valid_referers指令配置的值,$invalid_referer变量将会被赋值为1。
valid_referer指令的语法结构为:

valid_referers none | blocked | server_names | string ....;
none 检测Referer头域不存在的请求
blocked 检测Referer头域的值被防火墙或者代理服务器删除或伪装的情况。
这种情况下,该头域的值不以“http://”或者“https://”开头
server_names 设置一个或多个URL,检测Referer头域的值是否是这些URL中的某个。
从nginx 0.5.33以后支持使用通配符“*”。

三:实例配置

环境:centos6.5的主机两台
盗链服务器的IP为172.25.254.2 域名www.test
被盗链服务器为172.25.254.3 域名www.fz
客户端用来测试,IP为172.25.254.56
最终达到的效果是,www.fz站点成功防盗链,而且将客户端请求的URL重写为.jpg,成功防止盗链行为。

1盗链服务器的配置

编辑nginx配置文件,创建一个测试的站点

server {listen 80;server_name www.test;location / {root /www;index index.html;}}

mkdir /www
vim /www/index.html

<html>
<body>
<h1>www.test</h1>
<img src=".jpg">
</body>
</html>

img语句意思为:当客户端访问自身服务器的www.test图片资源时,由于没有图片提供给客户端,将图片资源链接到www.fz上,从而返回给客户端。

2.被盗链服务器的配置

编辑nginx配置文件,创建一个测试的站点

server {listen 80;server_name www.fz;location / {root /www;index index.html;}
}

mkdir /www
/www中要有haha.jpg图片。
到这一步当客户端用浏览器访问www.test,返回的是www.fz上图片资源 ,盗链成功。


可以看到Referer的头域的值来自www.test

3 实现防盗链的配置实例

server {listen 80;server_name www.fz;location / {root /www;index index.html;}location ~* \.(jpg|jpeg|gif|png)$ {valid_referers www.fz;if ($invalid_referer) {rewrite ^/ .jpg;}}
}
server {listen 80;server_name summer.fz;location / {root /summer;index index.html;}
}

在配置中,当有网络连接对以jpg|jpeg|gif|png为后缀的图片资源发起请求时,如果检测到Referer头域中没有符合valid_referers指令配置的值,就将客户端请求 URL重写为.jpg。
为什么还要一个server标签,这是有原因的,当时自己看书看博文学习做实验的时候,发现一直跳转不到想要的结果,而是一个空白页面,几经周折,在51的博文无意发现关于Nginx防盗链的一段话,就是rewrite ^/ .jpg
这个图片是盗链返回的图片,也就是替换盗链网站所有盗链的图片。这个图片要放在没有设置防盗链的网站上,因为防盗链的作用,这个图片如果也放在防盗链网站上就会被当作防盗链显示不出来了,盗链者的网站所盗链图片会显示X符号。
所以为了达到自己期待效果,新建一个server标签,让URL重写到该站点下的图片。
最后,我用客户端再次访问www.test,看看结果怎样?

显示的不是被盗链的图片,而是我们自定义的图片;

更多推荐

Nginx服务之防盗链功能

本文发布于:2024-03-09 20:44:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1726069.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:防盗链   功能   Nginx

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!