nginx可通过if指令结合$http_referer变量匹配非法来源并返回403或444,需先判空、严谨正则、置于location块内,仅作基础防护。

可以直接在 Nginx 配置中使用 if 指令配合 $http_referer 变量,结合正则匹配或字符串比对,对非法 Referer 请求返回 403 或重定向。关键在于匹配逻辑要严谨,避免误杀或绕过。
识别并匹配非法 Referer
Nginx 通过内置变量 $http_referer 获取请求头中的 Referer 字段(注意拼写是 referer,不是 referrer)。该字段可能为空(如直接访问、HTTPS 跳转到 HTTP 等),需先判断是否非空再匹配,否则容易漏判或误判。
- 用
if ($http_referer ~* ^https?://(.+\.)?evil-site\.com)匹配来自 evil-site.com 及其子域名的 Referer - 用
if ($http_referer = "https://bad.example")精确匹配某个完整 Referer 字符串 - 推荐加
~*(不区分大小写)和锚点^,防止被伪造为https://good.com/evil-site.com/xxx这类干扰
返回 403 或跳转拦截
匹配成功后,最常用且明确的方式是直接返回 403 Forbidden,让客户端清楚无权访问;也可用 return 302 / 重定向到首页,但不利于调试且可能被爬虫忽略。
-
return 403;—— 简洁可靠,日志中易识别拦截行为 -
return 444;—— Nginx 特有状态码,直接关闭连接(不发响应头),更彻底,适合防御恶意采集 - 避免用
rewrite ... redirect,因为 Referer 可被篡改,重定向可能暴露内部路径或引发循环
放在合适的作用域中
规则应写在 server 块或具体 location 块内,不建议放在 http 全局块——除非所有站点统一策略。若只限制图片、API 接口等静态资源,优先放在对应 location 中,减少对 HTML 页面等合法 Referer 的影响。
- 示例:仅对
/images/下资源做 Referer 校验:location ^~ /images/ { if (...) { return 403; } } - 注意
if在location内使用是安全的,但在server级别大量使用可能影响性能,不过 Referer 检查开销极小 - 若需放行空 Referer(如书签直连、某些 App 内嵌 WebView),可在匹配前加
if ($http_referer = "") { break; }或单独放行
验证与注意事项
配置完成后必须重载 Nginx(nginx -s reload),并用 curl 手动测试:
-
curl -H "Referer: https://evil-site.com" https://yoursite.com/image.jpg应返回 403 -
curl -H "Referer: https://your-site.com" https://yoursite.com/image.jpg应正常返回 - 注意浏览器地址栏直接输入 URL 时 Referer 为空,不属于非法来源,不要误拦
- Referer 可被客户端随意伪造,该方式仅作基础防护,不能替代 Token、签名等强校验机制











