referer 丢失是因客户端未发送或发送值不符合后端要求,需用 proxy_set_header referer 主动注入合法值;常见原因包括跨域策略、spa 跳转、白名单校验及 https→http 重定向;配置时须带协议、放于 proxy_pass 前,并配套设置 host、x-real-ip、x-forwarded-proto 等头。

Referer 丢失不是 Nginx 主动“删掉”的,而是它默认只透传客户端原始值——但很多场景下客户端压根没发,或者发了也不符合后端要求。解决的关键是:明确后端真正需要什么 Referer,再用 proxy_set_header Referer 主动注入一个稳定、合法的值。
为什么后端收不到 Referer?
常见原因包括:
- 浏览器跨域请求(如前端 JS 加载图片/CSS)时按
strict-origin-when-cross-origin策略自动省略路径,只留协议+域名 - 单页应用(SPA)用 History API 跳转,
document.referrer为空,后续 AJAX 请求无 Referer - 后端做了 Referer 白名单校验,只接受
https://example.com这类完整、带协议的地址,而原始值可能是空、https://example.com/login或甚至http://insecure.test - HTTPS 页面重定向到 HTTP 外链,浏览器直接抹掉 Referer 防泄露
在 Nginx 中主动设置 Referer
在对应 location 块中添加(务必放在 proxy_pass 之前):
proxy_set_header Referer "https://example.com";
- 引号必须保留,URL 必须带协议(
http://或https://),否则 Nginx 启动失败 - 值应与后端白名单完全一致,通常就是你的主站地址
- 如需动态匹配当前访问域名,可用变量:
proxy_set_header Referer "$scheme://$host/"; - 该指令会覆盖客户端原始 Referer,确保后端收到的是你指定的值
配套必须加的 header
单设 Referer 不够,还需保障基础转发语义正确:
-
proxy_set_header Host $host;—— 让后端知道用户访问的是哪个域名 -
proxy_set_header X-Real-IP $remote_addr;和X-Forwarded-For $proxy_add_x_forwarded_for;—— 传递真实客户端 IP -
proxy_set_header X-Forwarded-Proto $scheme;—— 告知后端原始请求是 HTTP 还是 HTTPS - 若目标站走 HTTPS,且用了 SNI(如 Cloudflare),记得加
proxy_ssl_server_name on;,否则可能 502
验证是否生效
三种快速确认方式:
- 在后端打印日志:PHP 查
$_SERVER['HTTP_REFERER'],Node.js 查req.headers.referer - 用 curl 模拟请求:
curl -H "Host: your-proxy.com" http://127.0.0.1/path,观察后端实际收到的值 - 在 Nginx access_log 中加入
$http_referer变量,看日志里 upstream 收到的是什么











