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

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

**测试环境**

- 版本号: 26100.33650
- 版本: Standard / Datacenter
- 架构: x64
- 证据: E1
- 核验日期: 2026-10-29

## 一句话结论

反代必须告诉应用：

- **客户端是谁**：`X-Forwarded-For`（或 RFC 7239 `Forwarded`）；
- **什么协议**：`X-Forwarded-Proto`；
- **哪个主机**：保留 `Host`；
- **哪个路径前缀**：应用挂在 `/app` 时用 `X-Forwarded-Prefix`。

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

## Nginx

```nginx
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;
}
```

路径挂载：

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

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

## IIS ARR

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

## 应用信任

Express：

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

ASP.NET Core：

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

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

## 重定向循环

现象：浏览器在 `http`/`https` 之间跳，或跳到 `localhost`。

原因：

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

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

## 验证

```powershell
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，重定向用公网名。

> **警告: 转发头可伪造**
>
> 客户端能直连应用时，自己就能发 `X-Forwarded-For`。应用绑 localhost/私网，只信任代理地址。

## 实验室边界

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

## 来源

- [nginx — proxy 头](https://nginx.org/en/docs/http/ngx_http_proxy_module.html)
- [Microsoft Learn — ARR 反向代理](https://learn.microsoft.com/zh-cn/iis/extensions/url-rewrite-module/reverse-proxy-with-url-rewrite-v2-and-application-request-routing)
- [RFC 7239 — Forwarded](https://datatracker.ietf.org/doc/html/rfc7239)

---

来源页面: https://winbook.fyi/zh/server/tls/proxy-headers/
