proxy_set_header Host 指令用于设置或覆盖发送给后端的 Host 请求头值,而非重写后端自身Host;需在 location 中显式指定如 proxy_set_header Host api.example.com; 且须置于 proxy_pass 前。

在 Nginx 中,location 块里的 proxy_set_header 指令本身**不会重写后端的 Host 请求头**,但它可以**设置或覆盖发送给后端服务器的 Host 请求头值**——这正是实现“对后端 Host 的重写”的标准方式。
明确目标:让后端收到你指定的 Host 值
默认情况下,Nginx 用 $proxy_host(即 proxy_pass 指定的地址)作为 Host 头发给后端。如果你希望后端看到的是另一个域名(比如 api.example.com),就必须显式用 proxy_set_header Host 覆盖它。
基本写法:直接指定 Host 值
在 location 块中添加:
-
proxy_set_header Host api.example.com;→ 后端固定收到Host: api.example.com -
proxy_set_header Host $host;→ 透传客户端请求的 Host(常用于反向代理多租户) -
proxy_set_header Host $http_host;→ 透传带端口的 Host(如example.com:8080)
注意点:顺序和继承关系
proxy_set_header 是可继承的,但**同名 header 会被最后定义的覆盖**。所以:
- 如果在
http或server块里已设了Host,需在location里重新写一遍才能覆盖 - 确保
proxy_set_header Host ...写在proxy_pass之前(虽然 Nginx 通常会自动调整顺序,但显式前置更稳妥) - 不要写成
proxy_set_header Host $host:$server_port这类错误拼接——除非后端真需要端口,否则多数情况只用$host或字面量
典型场景示例
假设你用 Nginx 代理请求到 http://127.0.0.1:3000,但后端服务依赖 Host: internal-api.company.local 才能路由:
location /api/ {
proxy_pass http://127.0.0.1:3000/;
proxy_set_header Host internal-api.company.local;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
这样,后端收到的请求中 Host 就是 internal-api.company.local,而非 127.0.0.1:3000 或客户端原始 Host。
不复杂但容易忽略:Host 头不是 URL 的一部分,而是 HTTP 请求头字段;重写它靠的就是 proxy_set_header Host 这一行明确赋值。


















