首页 > 代码库 > [Nginx]用Nginx实现与应用结合的访问控制 - 防盗链
[Nginx]用Nginx实现与应用结合的访问控制 - 防盗链
应用场景:图片等资源需要设置权限,如:只有认证过的用户才能访问自己的图片。
解决办法:使用Nginx的防盗链模块http_secure_link可以实现,该模块默认情况下不包含,故在安装时要加上--with-http_secure_link_module
该模块根据两个参数控制权限访问,一个是过期时间(即该链接在这个时间之前可访问,过期后无法访问),该参数主要出于安全考虑。
另一个是通过md5算法算出来的KEY,一般通过uri计算
举例:
server { listen 80; server_name 192.168.1.22; root /home/search/upload/portal_upload/user; location / { index index.html index.htm; } location /img/dossier/ { secure_link $arg_st,$arg_e; secure_link_md5 guahao@345$uri$arg_e; if ($secure_link = "") { return 403; } if ($secure_link = "0") { return 403; } rewrite ^/img/dossier/(.*)$ /img/dossier/$1 break; } }上面的secure_link定义了控制权限的两个参数(分别是st, e)
其中e就是上述的过期时间,建议e = 当前时间 + 有效期限(5分钟)
例如:
e = date +%s -d "December 22, 2014 12:22:03"
= 1419222123
st的计算公式如下:md5(PKEY,uri,e),其中PKEY是自定义的常量
例如:
st = php -r ‘print str_replace("=", "",strtr(base64_encode(md5("guahao@345/img/dossier/16/641fd565-ec87-4cbe-b4ae-7eedba41bb0e.jpg1419222123",TRUE)),"+/","-_")) . "\n";‘
=13c9kZrZT1qnNgpG4Vtksw
效果如下:
http://192.168.1.22/img/dossier/16/641fd565-ec87-4cbe-b4ae-7eedba41bb0e.jpg --不可访问
http://192.168.1.22/img/dossier/16/641fd565-ec87-4cbe-b4ae-7eedba41bb0e.jpg?st=13c9kZrZT1qnNgpG4Vtksw&e=1419222123 --过期前可访问,过期后不可访问
http://192.168.1.22/img/headpic/13/13_140x140.jpg --不在dossier下面的图片没有访问限制
OK,到此为此我们基本实现的基于应用的权限控制,且方法灵活,因为e和st的生成由应用程序来控制,能进行任意的修改和变动,而架构不受影响。