如何阻止访问WordPress站点wp-content/uploads目录下的上传资源
WordPress站点图片直链拦截解决方案
常见失效原因
- 「Prevent Direct Access」类插件失效,大多是因为静态图片请求被服务器、缓存插件直接返回,没有经过WordPress的PHP处理流程,插件的拦截逻辑无法触发
- 现有.htaccess规则的核心逻辑漏洞是第一条判断过滤了空Referer的请求,用户直接在地址栏输入图片URL时Referer为空,会直接绕过拦截规则。同时要先确认Apache配置符合要求:
- 确认Apache已开启
mod_rewrite扩展 - 确认站点vhost配置中
AllowOverride参数设置为All,否则.htaccess规则不会被加载
- 确认Apache已开启
修复后的规则配置
Apache服务器(.htaccess)
<IfModule mod_rewrite.c> RewriteEngine On # 允许指定域名的Referer访问 RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?mydomain.be [NC] RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google.com [NC] RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?facebook.com [NC] RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?twitter.com [NC] # 空Referer也拦截 RewriteCond %{HTTP_REFERER} ^$ RewriteRule \.(jpg|jpeg|png|gif)$ - [F,L] </IfModule>
Nginx服务器
Nginx默认不支持.htaccess,需要直接修改站点配置文件添加如下规则:
location ~* \.(jpg|jpeg|png|gif)$ { valid_referers mydomain.be www.mydomain.be google.com www.google.com facebook.com www.facebook.com twitter.com www.twitter.com; if ($invalid_referer) { return 403; } }
更高安全性的方案
普通防盗链规则可以被伪造Referer绕过,要彻底杜绝直链访问可以用PHP鉴权方案:
- 修改
wp-content/uploads目录权限,禁止对外直接访问 - 在主题
functions.php中添加自定义代码,将所有图片的输出链接修改为带加密参数的PHP路由地址 - 新增图片处理路由,校验请求参数是否合法,校验通过后再读取本地图片文件返回响应
辅助防护手段
- 所有原图自动添加水印,即使被盗取也保留来源标识
- 修改WordPress默认上传目录路径,避免用户通过通用路径猜解访问
- 如果使用CDN服务,直接在CDN控制台配置防盗链规则,生效更快还能减少源站请求压力
内容的提问来源于stack exchange,提问作者Killian Graas
相关产品推荐
相关产品推荐

