使用nginx做防盗链代理

发布: 2009-09-18 13:14

nginx是一款高效精悍、功能强大的web server, 本篇实现的功能基于nginx两个功能模块,以及nginx的强大配置功能。

用到的两个主要模块:
upstream模块,http_referer模块。

首先做一个代理配置,在nginx.conf的http段加入下面一段:
upstream backend_hack_link {
server 192.168.1.15 weight=3;
}
这个定义了一个指向192.168.1.15的代理服务器。

在server段添加配置代码:
[code type="config"]
server {
listen 80;
server_name images.qtchina.net *.qtchina.net;

charset utf-8;

access_log /data/log/qtchina.net.access.log;

location / {
# root html;
# index index.html index.htm;

valid_referers none blocked *.qtchina.net;
if ($invalid_referer){
return 403;
}

###impl this condition if ($http_referer = "" && $cookie_imqtchina != "1") { return 403; }
set $referer_and_cookie $http_referer/$cookie_inwm/$request_filename;
if ($referer_and_cookie ~ ^//(.+)\.mp3$) {
return 406;
}

proxy_pass http://backend_hack_link/;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr; # 将客户端的真实IP传给proxy后端
proxy_set_header X-Forwarded-For $remote_addr;
# proxy_set_header REMOTE_ADDR $remote_addr;
proxy_set_header Host $host;
proxy_pass_request_headers on;
proxy_pass_request_body on;
set_real_ip_from 0.0.0.0;
real_ip_header xxxxx-remote_addr;
}
}

[/code]

第一段验证
valid_referers指定有效的refer来源,在这的含义是,如果是没有refer或者refer以qtchina.net结尾,则属于有效refer来源,直接到请求转到代理后端服务器192.168.1.15。
如果非上述的refer,则返回403禁止访问。

第二段验证
当有cookie且来源为空,表示已经登陆过qtchina.net站点,可能通过。否则返回403禁止访问。
这种方法的一个问题是使用了一个全站通用的cookie, 不过只需要在所有页面中加一行即可实现,也不太复杂。这种方法可以实现对多媒体数据,像mp3,flash等的防盗链功能。

javascript代码:
[code type="javascript"]

[/javascript]

上面的配置文件需要nginx支持realip模块。如果在项目中使用,请修改相应的域名及服务器信息。




原文: http://qtchina.tk/?q=node/339

Powered by zexport