在LNMP(Linux+Nginx+MySQL+PHP)架构中,Nginx作为Web服务器是实现防盗链的核心组件。防盗链的本质是通过检查HTTP请求的Referer头部,判断资源请求是否来自合法域名,从而阻止非法盗用。以下是详细的配置步骤及注意事项:
1. 打开Nginx配置文件
LNMP环境中,虚拟主机配置文件通常位于/usr/local/nginx/conf/vhost/(如yourdomain.conf)或/etc/nginx/sites-available/(如default.conf)。使用文本编辑器(如vim)打开对应文件:
vim /usr/local/nginx/conf/vhost/yourdomain.conf
2. 添加防盗链规则
在server块内添加以下配置(以图片、CSS、JS文件为例):
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
# 设置允许的Referer来源:none(直接访问)、blocked(被Nginx阻止的Referer)、合法域名
valid_referers none blocked yourdomain.com www.yourdomain.com;
# 如果Referer无效,返回403 Forbidden(或重定向到自定义图片)
if ($invalid_referer) {
# 方式1:返回403错误(简单有效)
return 403;
# 方式2:重定向到默认防盗链图片(需确保图片路径可外链)
# rewrite ^/ http://yourdomain.com/static/nohotlink.jpg;
}
# 可选:设置资源缓存时间(减少重复请求)
expires 30d;
}
参数说明:
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$:匹配所有以指定后缀结尾的静态资源请求(不区分大小写);valid_referers:定义合法的Referer来源,none允许直接访问(如用户手动输入URL),blocked允许被Nginx拦截的Referer(如某些爬虫),yourdomain.com和www.yourdomain.com为你的合法域名;if ($invalid_referer):若Referer不在valid_referers列表中,则执行后续操作(返回403或重定向);expires 30d:设置资源缓存时间为30天,提升访问速度。1. 针对特定目录配置防盗链
若仅需保护/images/目录下的资源,可将location改为目录匹配:
location /images/ {
alias /data/www/yourdomain/images/; # 资源实际路径
valid_referers none blocked yourdomain.com www.yourdomain.com;
if ($invalid_referer) {
return 403;
}
}
2. 使用ngx_http_accesskey_module模块(增强安全性)
通过MD5加密生成动态访问密钥,防止伪造Referer。步骤如下:
ngx_http_accesskey_module,修改Nginx编译配置并重新编译(需重新安装Nginx);location中添加以下规则:location /protected/ {
accesskey on; # 开启accesskey模块
accesskey_hashmethod md5; # 加密方式为MD5
accesskey_arg "key"; # URL中密钥参数名(如?key=xxx)
accesskey_signature "yourpassword$remote_addr"; # 加密字符串(密码+用户IP)
}
http://yourdomain.com/protected/file.zip?key=md5(yourpassword+用户IP))。测试配置语法:
修改配置文件后,运行以下命令检查语法是否正确:
/usr/local/nginx/sbin/nginx -t
若显示configuration file /usr/local/nginx/conf/nginx.conf test is successful,则表示配置正确。
重新加载Nginx:
使配置生效,无需重启服务:
/usr/local/nginx/sbin/nginx -s reload
或使用systemctl(适用于systemd系统):
systemctl reload nginx
valid_referers中的none必须保留,否则直接访问资源(如用户手动输入URL)也会被拦截;secure_link模块,密钥(如segredo)需严格保密,定期更换;secure_link时,Nginx服务器与PHP服务器的时间需保持一致(误差不超过5分钟),否则会导致合法链接失效;if指令会轻微影响Nginx性能,建议仅在必要时使用,避免在location中过度嵌套if。通过以上配置,LNMP环境中的Nginx可有效防止资源被盗链,保护服务器带宽及内容版权。