跳转到内容

反代后的真实客户端 IP、路径前缀与 Host

核验于 1 分钟阅读

正确转发 X-Forwarded-For/Proto/Prefix 和 Host,只信任代理,避免重定向循环与错误绝对 URL。

测试环境Standard / Datacenter · 版本号 26100.33650 · x64
E1
版本号
26100.33650
版本
Standard / Datacenter
架构
x64
支持
文档(E1)
证据
E1官方文档
核验日期
2026-10-29
页面类型
任务

反代必须告诉应用:

  • 客户端是谁:X-Forwarded-For(或 RFC 7239 Forwarded);
  • 什么协议:X-Forwarded-Proto;
  • 哪个主机:保留 Host;
  • 哪个路径前缀:应用挂在 /app 时用 X-Forwarded-Prefix。

应用只能信任来自代理的这些头。

location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
}

路径挂载:

location /app/ {
proxy_pass http://127.0.0.1:3000/;
proxy_set_header X-Forwarded-Prefix /app;
}

proxy_pass 末尾斜杠会去掉 /app/;前缀头告诉应用怎么生成链接。

  • 在农场/代理设置里保留 Host。
  • 转发 X-Forwarded-For/X-Forwarded-Proto。
  • 应用在路径下时,用 URL Rewrite 服务器变量设 X-Forwarded-Prefix。
  • 除非应用按 localhost 配好,不要把 Host 改写成 localhost。

Express:

app.set('trust proxy', 1);

ASP.NET Core:

app.UseForwardedHeaders(new ForwardedHeadersOptions {
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

配置已知代理/网段;默认通常只信任 loopback。公网主机不要信任所有代理。

现象:浏览器在 http/https 之间跳,或跳到 localhost。

原因:

  • TLS 终止后代理发的 X-Forwarded-Proto: http;
  • 应用忽略头并跳 HTTPS;
  • 代理把 Host 改成内部名;
  • 规范主机规则抓到健康检查。

修头/信任边界,不要全局关 HTTPS 跳转。

终端窗口
curl.exe -I -H "X-Forwarded-Proto: https" https://lab.example/
curl.exe -H "Host: app.example" http://127.0.0.1:3000/whoami

应用应报告公网 scheme/host、真实客户端 IP,重定向用公网名。

E1。实验室 IIS/Nginx 没有多跳代理;头配置是 Server 2025 上用真实上游验证的方案。

来源