欧阳简之 > Nginx利用secure_link模块实现防盗链

热爱代码,对每一行代码保持一颗敬畏之心。

如果您有附件/下载服务器,如果确保不被恶意盗用呢?推荐使用Nginx自带的secure_link模块解决,非常方便好用。

安装nginx secure_link

./configure --prefix=/data/app/nginx \ --with-http_secure_link_module \ --with-http_stub_status_module

如果已经安装好nginx,追加secure_link模块,重新编译 make,不能make install,然后替换nginx二进制文件

cp /data/app/nginx/sbin/nginx /data/app/nginx/sbin/nginx.bak
cp objs/nginx /data/app/nginx/sbin/

测试新的nginx是否正确

/data/app/nginx/sbin/nginx -t
nginx: the configuration file /data/app/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /data/app/nginx/conf/nginx.conf test is successful

Nginx配置

location ~ .*\.(gif|jpg|png|jpeg)$ {
    set $secret 6n@33g8gsy=o31hdf3yha9v2g8e&1uzn;  # 密钥建议定期更新
    secure_link $arg_token,$arg_expires;           # md5哈希值,过期时间
    secure_link_md5 "$secret$uri$arg_expires";     # 如果它生成的md5哈希值与用户提交过来的md5哈希值一致,那么这个变量的值为1,否则为0
    if ($secure_link = "") {
        return 403;
    }
    if ($secure_link = "0") {
        return 410;
    }
}

测试

<?php

$host    = 'http://192.168.10.100';
$uri     = '/1.jpg';
$secret  = '6n@33g8gsy=o31hdf3yha9v2g8e&1uzn';   // 密钥,和Nginx配置保持一致
$expires = 1800;                                 // 文件有效时间,单位秒,可自定义

$time  = time() + $expires;
$token = str_replace('=', '', strtr(base64_encode(md5($secret . $uri . $time, true)), '+/', '-_'));

echo "$host$uri?token=$token&expires=$time";

然后访问URL,测试可以访问则正常,完成。

tagged by Nginx 防盗链 secure_link 安全