有没有用我没试过,转自:https://www.itbulu.com/pic-rewrite-404.html

一般我们在编辑网站内容的时候都会辅助加入图片,这样使得内容更具备真实性和可读性。由于搜索引擎对于图片的抓取,以及网站内容被他人采集、复制问题,往往也会将图片直接复制过去,但是并不是将图片下载到他们本地,而是直接调用原网站的图片链接。

这样势必会增加原网站服务器的负担、流量等问题。老蒋在前几天也看到有不少的网站复制博客的文章,但是图片直接引用我这边的,当然也不会标注文章出处,好歹你也要把图片一起下载过去才行。出于这样的问题,我决定将网站服务器环境设置防盗链。当然,我一并将Nginx和Apache两个常用环境的图片防盗链方法一起分享。

第一、Nginx服务器图片防盗链规则

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
expires 30d;
access_log off;
valid_referers none blocked *.itbulu.com server_names ~\.google\. ~\.baidu\.;
if ($invalid_referer) {
#return 403;
rewrite ^/ http://img.itbulu.com/dao.jpg;
}
}

我们将修改当前站点的.CONF规则中,将修改和替换对于图片和流媒体的控制模块。我们可以直接将图片设置403不可见,也可以设置一个替代图片。同时,我们也需要允许百度、谷歌搜索引擎的抓取。

第二、Apache服务器图片防盗链规则

# 开启Rewrite模块
RewriteEngine On
# 定义要保护的文件夹,建议只要保护上传文件夹(/wp-content/uploads/)就可以
RewriteBase /wp-content/uploads/
#允许空的来源,因为用户可能手动输入图片网址
RewriteCond %{HTTP_REFERER} !^$ [NC] #允许自己的网站访问啦
RewriteCond %{HTTP_REFERER} !itbulu.com [NC] #允许几个常用的在线阅读器的访问
RewriteCond %{HTTP_REFERER} !google.com [NC] RewriteCond %{HTTP_REFERER} !baidu.com [NC] RewriteCond %{HTTP_REFERER} !feedsky.com [NC] #括号中的是要保护的文件拓展名,这里只保护了 gif,jpg,png,再加上出错时的图片地址
RewriteRule .*\.(gif|jpg|png)$ http://img.itbulu.com/dao.jpg [R,NC,L]

修改我们网站所在的.htaccess文件。

这样,我们可以根据自己需要的网站服务器环境进行修改图片防盗链。

Nginx设置图片防盗链(白名单与黑名单)


https://blog.csdn.net/u012811805/article/details/114109469

某些时候可能您会发现,别人网站直接将您的网站图片拿过去使用,导致额外消耗服务器流量和带宽,如果本身服务器带宽和流量就比较小,被人盗链后势必会造成一定影响。这篇文章分享下如何通过Nginx来设置防盗链,禁止其它网站盗用图片。

aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuL2ltZ19jb252ZXJ0LzEzMDQxNDU0ZjRkMGI0YjEzNjhkMmEyMGMwN2MyMjY2LnBuZw.png

防盗链原理

防盗链的原理其实很简单,目前比较流行的做法就是通过Referer来进行判断和限制,Referer的解释说明如下:

HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。——引用自百度百科

简单来说,假如我博客域名是xiaoz.me,我在nginx中设置,只允许Referer为*.xiaoz.me的来源请求图片,其它网站来的一律禁止。这里我们需要用到ngx_http_referer_module模块和$invalid_referer变量,请看下面进一步解释。

ngx_http_referer_module模块

ngx_http_referer_module模块用于阻止对“Referer”头字段中具有无效值的请求访问站点。应该记住,使用适当的“Referer”字段值来构造请求非常容易,因此本模块的预期目的不是要彻底阻止此类请求,而是阻止常规浏览器发送的请求的大量流量。还应该考虑到,即使对于有效请求,常规浏览器也可能不发送“Referer”字段。

  • 语法:valid_referers none | blocked | server_names | string ...;

  • 可用于:server,location

可以看到valid_referers指令中存在一些参数,比如none|blocked,含义如下:

  • none:请求标头中缺少“Referer”字段,也就是说Referer为空,浏览器直接访问的时候Referer一般为空。

  • blocked:Referer”字段出现在请求标头中,但其值已被防火墙或代理服务器删除; 这些值是不以“http://” 或 “https://” 开头的字符串;

  • server_names:服务器名称,也就是域名列表。

$invalid_referer变量

我们设置valid_referers 指令后,会将其结果传递给一个变量$invalid_referer,其值为0或1,可以使用这个指令来实现防盗链功能,如果valid_referers列表中没有包含Referer头的值,$invalid_referer将被设置为1。

设置防盗链白名单

白名单就是只允许白名单内的域名访问,其余一律禁止。

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico|webp)$ {valid_referers none blocked *.xiaoz.me *.xiaoz.top;if ($invalid_referer) {return 403;}}

上面的配置含义是先用location匹配出需要的格式(图片和视频),然后用valid_referers指令设置允许的域名,其它域名没有包含在valid_referers列表中,$invalid_referer变量返回的值为1,最终返回403,禁止访问。以上就是防盗链白名单的设置。

防盗链黑名单

黑名单与白名单正好相反,就是只禁止黑名单中的域名请求,其余一律放行,相比白名单,黑名单的限制更加宽松。网上大部分教程只提到了防盗链白名单的设置,了解原理后黑名单的设置方法也差不多。

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico|webp)$ {valid_referers *.baidu.com;if ($invalid_referer = 0) {return 403;}}

上面的配置中我们用valid_referers指令设置黑名单域名*.baidu.com,获取到指定的Referer头之后,$invalid_referer返回值为0,最终返回403,禁止百度的域名来访问。

总结

以上就是Nginx防盗链(黑白名单)的设置,了解原理后其实非常简单,但由于Referer可以任意伪造,上述方法无法拦截伪造的Referer请求,不过大部分常见的场景还是有作用的。如果您服务器带宽和流量本身就比较小,建议加上防盗链设置。


以下转自:

https://www.cnblogs.com/shuaixf/archive/2011/11/14/2249078.html


 Nginx 是一个很牛的高性能Web和反向代理服务器, 它具有有很多非常优越的特性; 在高连接并发的情况下,Nginx是Apache服务器不错的替代品,目前Web服务器调查显示Apache下降Ngnix攀升,linux下更多的服务商选择了Ngnix放弃了Apache; Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一. 能够支持高达 50,000 个并发连接数的响应, 感谢Nginx为我们选择了 epoll and kqueue作为开发模型. 目前中国大陆使用nginx网站用户有:新浪、网易、 腾讯,另外知名的微网志Plurk也使用nginx。

 

一般常用的方法是在server或者location段中加入!
valid_referers   none  blocked  www.hihi123.com  hihi123.com;


详见下面的例子
其中 none 表示空的来路,也就是直接访问,比如直接在浏览器打开一个图片
blocked 表示被防火墙标记过的来路
server_names 也就是域名了。0.5.33以后的版本中,可以用*.hihi123.com来表示所有的二级域名

 

一、针对不同的文件类型

location ~ .*\.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv)$ {
     valid_referers none blocked *.765h.com 765h.com     if ($invalid_referer) {
     #rewrite ^/ //www.765h.com/error.html     return       }
}

第一行:wma|gif|jpg|png|swf|flv

表示对wma、gif、jpg、png、swf、flv后缀的文件实行防盗链
第二行:*.765h.com 765h.com
表示对*.765h.com 765h.com这2个来路进行判断(*代表任何,任何的二级域名),你可以添加更多
if{}里面内容的意思是,如果来路不是指定来路就跳转到403错误页面,当然直接返回404也是可以的,也可以是图片。

 

二、针对不同的目录

location /img/ {
    root /data/img/    valid_referers none blocked *.765h.com 765h.com    if ($invalid_referer) {
                   rewrite  ^/  //www.765h.com/images/error.gif                   #return       }
}

 以上是nginx自带的防盗链功能。

 

三、nginx 的第三方模块ngx_http_accesskey_module 来实现下载文件的防盗链

安装Nginx和nginx-http-access模块

#tar zxvf nginx-...tar.gz
#cd nginx-../
#tar xvfz nginx-accesskey-...tar.gz
#cd nginx-accesskey-.. 
#vi config
#把HTTP_MODULES= 修改成HTTP_MODULES= (这是此模块的一个bug)
#./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module ---module=/root/nginx-accesskey-..


编译成功后,在主配置文件加入类似下面的代码:

server{ 
..... 
    location /download { 
        accesskey             on        accesskey_hashmethod  md5        accesskey_arg                 accesskey_signature       } 
}

/download 为你下载的目录。

 

前台php产生的下载路径格式是:

1.http://*****.com/download/1.zip?key=<?php echo md5('mypass'.$_SERVER["REMOTE_ADDR"]);?>
这样,当访问没有跟参数一样时,其他用户打开时,就出现:403

 

NginxHttpAccessKeyModule第三方模块,实现方法如下:

1. 下载Nginx HttpAccessKeyModule模块文件:Nginx-accesskey-2.0.3.tar.gz

 

2. 解压此文件后,找到nginx-accesskey-2.0.3下的config文件。编辑此文件:替换其中的"$HTTP_ACCESSKEY_MODULE"为"ngx_http_accesskey_module";


3. 用一下参数重新编译nginx:

./configure --add-module=path/to/nginx-accesskey


4. 修改nginx的conf文件,添加以下几行:

location /download {
  accesskey             on  accesskey_hashmethod  md5  accesskey_arg           accesskey_signature   }


其中:
accesskey为模块开关;
accesskey_hashmethod为加密方式MD5或者SHA-1;
accesskey_arg为url中的关键字参数;
accesskey_signature为加密值,此处为mypass和访问IP构成的字符串。

 

访问测试脚本download.php:

<?
= ("mypass".['REMOTE_ADDR']);
="<a href=http://www.example.cn/download/G3200507120520LM.rar?key="..">download_add_key</a><br />";
="<a href=http://www.example.cn/download/G3200507120520LM.rar>download_org_path</a><br />";
 ;
 ;
?>


访问第一个download_add_key链接可以正常下载,第二个链接download_org_path会返回403 Forbidden错误。

如果不怕麻烦,有条件实现的话,推荐使用Nginx HttpAccessKeyModule这个东西。

他的运行方式是:如我的download 目录下有一个 file.zip 的文件。对应的URI 是http://www.765h.com/download/file.zip
使用ngx_http_accesskey_module 模块后http://www.765h.com/download/file.zip?key=09093abeac094. 只有给定的key值正确了,才能够下载download目录下的file.zip。而且 key 值是根据用户的IP有关的,这样就可以避免被盗链了。

据说Nginx HttpAccessKeyModule现在连迅雷都可以防了,可以尝试一下。


下载:
Nginx 0.8.51 稳定版下载:nginx-0.8.51nginx/Windows-0.8.51
HttpAccessKeyModule第三方模块下载:http://wiki.nginx.org/images/5/51/Nginx-accesskey-2.0.3.tar.gz