如果您有附件/下载服务器,如果确保不被恶意盗用呢?推荐使用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 [email protected]=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 = '[email protected]=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,测试可以访问则正常,完成。