nginx防盗链配置中必须保留none和blocked以支持本地调试:none放行地址栏直输、书签访问等无referer请求,blocked放行localhost、127.0.0.1等无效referer场景,二者共同覆盖vite/webpack dev server、webview、pwa等典型开发环境。

Nginx 防盗链配置中允许本地调试,关键在于保留 none 和 blocked 这两类合法但无有效 Referer 的请求场景——它们恰恰覆盖了大多数本地开发和调试行为。
为什么本地调试常被误拦?
浏览器直接在地址栏输入图片 URL、用收藏夹打开、通过 VS Code Live Server 启动页面、WebView 加载、PWA 离线访问、甚至某些企业内网网关或代理清理 Referer,都会导致请求不带 Referer 或 Referer 被设为 about:blank/localhost/127.0.0.1。这类请求的 Referer 属于 none 或 blocked,不是“非法”,而是典型调试环境特征。
正确写法(必须包含):
location ~* \.(jpg|jpeg|png|gif|webp|svg|mp4|pdf)$ {
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
}
expires 7d;
}
-
none:放行地址栏直输、书签访问、curl 不带-H "Referer:..."等无 Referer 请求 -
blocked:放行 Referer 存在但无效的情况(如localhost:3000、127.0.0.1:8080、file://、about:blank),这正是前端本地服务(Vite、Webpack Dev Server)、移动端 WebView、Electron 应用常见情形
额外建议(提升兼容性):
-
若你用
http://localhost:3000或http://127.0.0.1:8080开发,可显式加进白名单:valid_referers none blocked example.com *.example.com localhost:3000 127.0.0.1:8080;
注意:端口必须写全,且仅对 HTTP 协议生效;HTTPS 环境需对应写
https://localhost:3000(但多数浏览器会拒绝跨协议 Referer) 不要把
valid_referers放在http { }或顶层server { }中——它只在server或location块内生效,且应严格限定在静态资源路径下(如location ~* \.(jpg|png)$),避免影响 API 或 HTML 路由切勿删掉
none blocked以“加强防护”——这等于把开发人员自己挡在外面,不是安全增强,而是自缚手脚
不复杂但容易忽略











