访问我的博客

前言

博主目前在一家原创小说网站公司工作,由于站内的作品全部是原创,于是乎不可避免地会被一些盗版网站爬取盗版,对于防盗版一直没有很好的对策,让公司很是苦恼。

最近去一些盗版网站上搜索我们网站作品时,发现他们所用的封面图片的来源是我们网站的地址,即所谓的盗链,这对于我们网站服务器的带宽是一种损失,因此需要采取对应的手段应对。

环境准备

这里我使用两台虚拟机 虚拟机的快速安装可以参考我另外一篇博文 CentOS快速安装

  • 服务器 A:192.168.200.130
  • 服务器 B:192.168.200.131

Nginx 安装

参考博文 Nginx缓存配置 的 Nginx 环境搭建部分。

Nginx 防盗链设置

一、配置 Nginx 的防盗链

# 修改 nginx.conf 配置文件
vim /usr/local/nginx/conf/nginx.conf # 添加 server 节点
server {
listen 80;
server_name www.vcmq.com;
#access_log logs/host.access.log main; location ~* \.(jpg|png|gif)$ {
root /home/resources;
valid_referers none server_names *.test1.com ~\.test2\.;
if ($invalid_referer){
rewrite ^/ http://ojt4b2cr5.bkt.clouddn.com/blog/20171028/214345352.png;
}
} location / {
root html;
index index.html index.htm;
}
}

可以看到,我新增的 server 的地址是 www.vcmq.com

location ~* \.(jpg|png|gif)$

此行配置的作用是匹配以 jpg/png/gif 结尾的文件请求, 如果匹配就执行 括号内的代码。

valid_referers none server_names *.test1.com ~\.test2\.;
if ($invalid_referer){
rewrite ^/ http://ojt4b2cr5.bkt.clouddn.com/blog/20171028/214345352.png;
}

首先看第一行,这行的作用是配置可以识别 refer,即可以正常获取资源文件的请求,在这里配置加入白名单的请求 refer 域名

参数说明:

  • none 代表请求的 refer 为空,也就是直接访问,比如在浏览器中直接访问图片 www.vcmq.com/test1.png,直接访问时,refer 会为空。
  • blocked refer 来源不为空,但是里面的值被代理或者防火墙删除了
  • server_names refer 来源包含当前的 server_nameslocation 的父节点 server 节点的 server_name 的值。
  • 字符串 定义服务器名称,比如 *.test1.com,配置后,来源是从 test1.com 就会被认为是合法的请求。
  • 正则表达式 匹配合法请求来源, 如 ~\.test2\.

当请求的 refer 是合法的,即可以被后面任一参数所匹配, $invalid_referer 的值为0, 若不匹配则值为 1, 进入 if 的代码中。我这里的设置是,如果是不合法的请求,就统一返回一张图片,也可以直接返回 403

二、配置 html 文件

1.在 /home 目录下创建目录 resources ,在 /home/resources 目录下放入一张图片 test.png

2.修改 nginx 安装目录下 html 中的 index.html 文件。添加一个 img 标签,src 访问上一步中的图片文件

<img src="http://www.vcmq.com/test.png" />

3.启动 nginx

/usr/local/nginx/sbin/nginx

4.以上所有配置是对于服务器 A 的配置,以下讲解服务器 B 的配置

  1. 服务器 B 和 服务器 A一样安装好 nginx
  2. 修改 nginx.conf 配置文件, 添加两个 server
server {
listen 80;
server_name www.test1.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
} server {
listen 80;
server_name www.test2.com;
location / {
root html;
index index.html index.htm;
}
}
  1. 修改服务器 B Nginx 安装目录下 html 目录中的 index.html 文件,同样添加 img 标签。
<img src="http://www.vcmq.com/test.png" />
  1. 启动 服务器 B 的 Nginx

配置注意事项

  1. 配置资源的 location 需要在 location / 之前。
  2. 如果在 location 或者其父节点 server 中没有配置 root 的值, 当请求时合法的时候,会 404 找不到资源文件,因此需要在 location 或者 server 节点设置 root 的值
  3. 注意调试的时候,务必使用 Ctrl + F5 进行刷新网页,因为 nginx 会缓存图片!

测试

我上面配置的 server_name 配置的域名是 www.vcmq.com ,因此测试时,需要将我电脑的 host 指向虚拟机的 ip, 可以使用 SwitchHosts 来便捷切换。

# 指向服务器A
192.168.200.130 www.vcmq.com # 指向服务器B
192.168.200.131 www.test1.com www.test2.com
  1. 浏览器访问 www.vcmq.com,图片正常加载

  1. 浏览器访问 www.test1.comwww.test2.com 还有直接访问图片 http://www.vcmq.com/test.png 都正常加载

  1. 修改 服务器 A 的 nginx.conf 配置文件
valid_referers none server_names *.test1.com ~\.test2\.;

将此行修改为

valid_referers none server_names;

即只允许当前 server_name 与 无 refer 的请求,其他请求都返回 rewrite 的图片, 然后重启 nginx

/usr/local/nginx/sbin/nginx -s reload

再次分别访问 ,注意需要使用 ctrl+F5 刷新一下缓存

www.vcmq.comwww.test1.comwww.test2.comhttp://www.vcmq.com/test.png

发现只有 www.vcmq.comhttp://www.vcmq.com/test.png 正常显示,其他请求皆返回 rewrite 的图片

同理再次修改 nginx.conf 文件, 允许来自 test1 的访问请求

valid_referers none server_names *.test1.com;

结果发现

www.test1.com可以获取正常图片,而www.test2.com还是 rewrite 之后的图片

至此,已经实现了基于 Nginx 的简单图片防盗链。

实际应用中,可以设置允许来自公司下的域名与空 refer 的请求通过。

这里允许 空 refer 的请求通过的原因是,有些合法的请求可能会没有带上 refer。

资源下载

参考文章

Nginx图片防盗链【实战】的更多相关文章

  1. Nginx图片防盗链配置

    如果我们自己网站内的图片资源被其它网站所盗用,这会增加自己网站的带宽资源,增加很多额外的消耗,而且会对我们系统的稳定性有影响,为了防止自己网站上的图片资源被其它网站所盗用,我们需要给自己的服务器配置防 ...

  2. Nginx图片防盗链的方式

    原文:http://www.open-open.com/code/view/1430750263460 location ~* \.(gif|jpg|jpeg|png|ico)$ { valid_re ...

  3. 完美的nginx图片防盗链设置详解

    一般,我们做好防盗链之后其他网站盗链的本站图片就会全部失效无法显示,但是您如果通过浏览器直接输入图片地址,仍然会显示图片,仍然可以右键图片另存为下载文件!依然可以下载?这样就不是彻底的防盗链了! [r ...

  4. asp.net MVC 网站图片防盗链的几种方法

    目录 1. 通过 URL Rewrite Module 组件 2. 通过 nginx 图片防盗链 3.自定义 HttpHandler 处理 4. 通过 MVC 自定义路由规则防盗链 5. 通过 MVC ...

  5. Nginx中防盗链(下载防盗链和图片防盗链)操作记录

    日常运维工作中,设置防盗链的需求会经常碰到,这也是优化网站的一个必要措施.今天在此介绍Nginx中设置下载防盗链和图片防盗链的操作~ 一.Nginx中下载防盗链的操作记录对于一些站点上的下载操作,有很 ...

  6. Nginx修改配置实现图片防盗链

    一般情况下,防盗链是针对软件下载和图片的,由于一般的站点不提供资源下载,所以本文主要是针对图片的防盗链 1.如果对全站图片做防盗链,至少需要一个另外的域名存放指向图片.因为如果对全站图片做了防盗链,包 ...

  7. Nginx中防盗链(下载防盗链和图片防盗链)及图片访问地址操作记录

    日常运维工作中,设置防盗链的需求会经常碰到,这也是优化网站的一个必要措施.今天在此介绍Nginx中设置下载防盗链和图片防盗链的操作~ 一.Nginx中下载防盗链的操作记录对于一些站点上的下载操作,有很 ...

  8. lnmp/nginx系统真正有效的图片防盗链完整设置详解

    http://www.it300.com/article-15345.html 关于nginx防盗链的方法网上有很多教程,都可以用,但是我发现很多教程并不完整,所做的防盗链并不是真正的彻底的防盗链! ...

  9. 防盗链Nginx设置图片防盗链,设置无效的请仔细看红字

    *******************************************************************切记,替换的图片地址要使用没有防盗链的网站图片,否则由于替换的图片 ...

随机推荐

  1. _编程语言_C++_Lambda函数与表达式

    C++11提供了对匿名函数的支持,称为Lambda表达式函数 Lambda 表达式把函数看作对象.Lambda 表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值 ...

  2. Lib作为“静态库”与“动态库”中的区别

    Lib作为“静态库”与“动态库”中的区别 0. 前言: 什么是静态连接库: 静态库在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中.因此对应的链接方式称为静态链接. 为什么 ...

  3. 18、标准IO库详解及实例

    标准IO库是由Dennis Ritchie于1975年左右编写的,它是Mike Lestbain写的可移植IO库的主要修改版本,2010年以后, 标准IO库几乎没有进行什么修改.标准IO库处理了很多细 ...

  4. hive函数 parse_url的使用

    hive提供了直接处理url的函数 parse_url desc funtion 的解释是: parse_url(url, partToExtract[, key]) - extracts a par ...

  5. 在推送提交之后阻止Azure DevOps (TFS)持续集成

    在Azure DevOps服务器上配置生成定义时,可以配置连续集成(CI)生成.每次签入或提交到源代码库时都会自动运行一个CI构建.这种机制允许开发人员启动一个自动化的过程,例如编译和部署构建.这是一 ...

  6. WPF异常捕获三种处理 UI线程, 全局异常,Task异常

    protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);RegisterEvents();} private v ...

  7. 【译】AI 让科技公司变得更强大吗

    机器学习可能是当今技术中最重要的基本趋势.由于机器学习的基础是数据 - 大量的数据 - 很常见的是,人们越来越担心已经拥有大量数据的公司会变得更强大.这有一定的道理,但是以相当狭窄的方式,同时ML也看 ...

  8. 【BZOJ5188】 [Usaco2018 Jan]MooTube

    BZOJ5188 [Usaco2018 Jan]MooTube 突然发现BZOJ没有题目,放题面. 题意翻译 题面描述 在业余时间,Farmer John创建了一个新的视频共享服务,他将其命名为Moo ...

  9. 2018-2019-2 20175230 实验三《Java面向对象程序设计》实验报告

    目录 实验三 实验三 敏捷开发与XP实践 实验内容 实验要求 实验步骤 (一) 编码标准 (二)敏捷开发与XP (三)敏捷开发与XP 实验体会 实验三 实验三 敏捷开发与XP实践 实验内容 1.XP基 ...

  10. nyoj 1274信道安全 第九届河南省赛(SPFA)

    信道安全 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 Alpha 机构有自己的一套网络系统进行信息传送.情报员 A 位于节点 1,他准备将一份情报 发送给位于节点 ...