运维小白入门——Nginx配置防盗
什么是防盗链:
防盗链技术主要用于防止未经授权的第三方或域名访问网站的静态资源。例如,一个网站可能拥有独特的图片素材,为了防止其他网站通过直接链接图片URL的方式访问这些图片,网站管理员会采用防盗链措施。这样做的原因包括保护版权、减少由于爬虫引起的服务器负载、以及避免不必要的数据流量。
nginx防盗链
防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息,如果别人只链接了自己网站的图片或某个单独的资源,而不是打开整个页面,这就是盗链,referer就是之前的那个网站域名,正常的referer信息有以下几种,nginx防盗链的代码定义:
-
定义合规的引用
valid_referers none | blocked | server_names | string ...;
-
拒绝不合规的引用
if ($invalid_referer) {
rewrite ^/.*$ http://www.b.org/403.html
}
参数说明:
- none:请求报文没有referer首部,比如用户直接在浏览器输入域名访问往web网站,就是没有referer信息
- blocked:请求报文由referer信息,但无又有效值为空
- server_names:referer首部中包含本主机及nginx监听的server_name
- invalid_referer:不合规的feferer引用
nginx实现防盗链
其实在Nginx里面,很容易就做到防盗链的,在nginx.conf文件加入一个localtion配置项。
下面请看配置:
server {
listen 80;
server_name dev.api.dd.com;
root /Users/lidong/Desktop/wwwroot/dd_api/public;
index index.php index.html index.htm;
access_log /Users/lidong/wwwlogs/dev.api.dd.com_access.log;
error_log /Users/lidong/wwwlogs/dev.api.dd.com_error.log;
location ~ [^/]\.php(/|$) {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
valid_referers none blocked dev.api.dd.com;
#### 加入如下配置,限定的资源文件如果被第三方调用直接返回403
if ($invalid_referer)
{
return 403;
}
}
try_files $uri $uri/ @rewrite;
location @rewrite {
rewrite ^/(.*)$ /index.php?_url=/$1;
}
}
显示给盗链者看到的图片,注意不要放到自己的域名上,因为放盗链的作用,那样对方是看不到的,可以上传到一些支持外联的网络相册上。
当然了,也可以设置某个目录防盗链,只需把localtion匹配的改成一个目录就可以了,比如:
location /www/ {
alias /www/;
### none blocked 去掉之后,访问文件的路径,无法直接到达
valid_referers none blocked www.qqqq.com qqqq.com;
if ($invalid_referer) {
return 404;
}
}
这样就对images这个目录设置防盗链了。
NGINX错误页面友好显示
范例1:对错误代码403实行本地页面跳转,命令如下:
ver {
listen 80;
server_name www.nmtui.com;
location / {
root html/www;
index index.html index.htm;
}
error_page 403 /403.html; ## 当出现403错误时,会跳转到403.html页面
}
# 上面的/403.html是相对于站点根目录html/www的。
范例2:50x页面放到本地单独目录下,进行优雅显示。
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /data0/www/html;}