Nginx防盗链应通过独立location块精准匹配静态资源后缀,如location ~*.(jpg|jpeg|png|gif|webp)$,配合valid_referers与if判断实现Referer校验,避免误拦动态资源或全局匹配。

限制文件类型是 Nginx 防盗链配置的关键一步,目的是只对图片、视频等易被盗用的静态资源启用 Referer 校验,避免误拦 HTML、API 接口或字体等合法请求。
用 location 块精准匹配后缀
推荐在 独立的 location 块 中定义要保护的文件类型,使用正则表达式匹配,且必须加 ~*(忽略大小写):
location ~* \.(jpg|jpeg|png|gif|webp|mp4|pdf|css|js)$ { ... }- 注意点号
.要转义为\.,否则会被当作任意字符匹配 - 多个后缀用竖线
|连接,不要漏掉常见变体(如jpeg和jpg) - 不建议写成
.*\.(...)或过于宽泛的路径,防止规则扩散到不该拦截的资源
按目录范围限制更稳妥
如果资源集中存放在特定路径下(如 /images/、/static/),优先用路径限定,再叠加后缀过滤:
location /images/ { location ~* \.(jpg|png|gif)$ { ... } }- 这样即使同名文件出现在其他路径(如
/api/avatar.jpg),也不会被防盗链规则影响 - 配合
root或alias指令确保文件能正确读取
避开常见误配陷阱
以下写法容易出问题,需避免:
- 把防盗链逻辑放在
location /或location ~ .*这类全局匹配块里——可能拦截 HTML 页面或接口返回 - 后缀列表中混入
.html、.php、.json等动态资源——Referer 检查对它们通常无意义,还可能导致页面加载失败 - 忘记加
~*,写成location .jpg { ... }——Nginx 会当作精确字符串匹配,无法生效 - 用
if直接套在 server 块里判断文件后缀——Nginx 官方明确不推荐,应始终嵌套在 location 内部
实际可复用的典型写法
例如只保护主站图片和 WebP 格式:
location ~* \.(jpg|jpeg|png|gif|webp)$ {
valid_referers none blocked server_names *.example.com example.com;
if ($invalid_referer) {
return 403;
}
}这段配置仅作用于匹配到的文件类型,安全、清晰、易于维护。


















