如何通过Nginx虚拟主机实现基于域名的请求头Header自定义-1

可以通过 Nginx 的 server 块配合 add_header 或 more_set_headers(需安装 ngx_headers_more 模块)为不同域名的虚拟主机单独设置自定义请求头(Header),实现基于域名的 Header 精准控制。

使用 add_header 为每个 server 设置专属响应头

add_header 是 Nginx 原生指令,适用于添加响应头(Response Headers),且作用域支持 http、server、location。在基于域名的虚拟主机中,直接在对应 server 块内配置即可实现差异化:

每个 server 块通过 server_name 绑定唯一域名(如 api.example.com、admin.example.com) 在该 server 内使用 add_header X-Env "production";,该 Header 仅对该域名生效 注意:add_header 在 location 中定义时,会覆盖上级(server)同名 Header;若需继承,需在所有 location 中重复声明或统一提至 server 级

通过 map 指令动态设置变量化 Header(推荐用于多域名批量管理)

当虚拟主机数量较多、Header 值存在规律性差异(如按域名区分环境、服务名),可用 map 预定义变量,再结合 add_header 使用,更清晰可维护:

在 http 块顶部定义映射关系:map $host $x_service_name {<br> api.example.com "api-service";<br> admin.example.com "admin-panel";<br> default "unknown";<br>} 在对应 server 块中写:add_header X-Service-Name $x_service_name; 该方式避免重复写多个 server 块内的 if 判断,也利于后续扩展和统一审计

需要修改请求头(Request Headers)?用 rewrite + proxy_set_header(反向代理场景)

原生 Nginx 不允许直接修改客户端发来的请求头(如 Host、User-Agent),但可在反向代理时,用 proxy_set_header 向后端传递自定义请求头。这常用于 API 网关类虚拟主机:

在 server 块的 location 中启用代理:proxy_pass https://backend; 添加转发时注入的请求头:proxy_set_header X-Domain-Source $host;<br>proxy_set_header X-Forwarded-For $remote_addr; 确保后端服务能读取这些 header(如 Node.js 的 req.headers[‘x-domain-source’])

进阶:添加自定义请求头(非标准 Header)并透传给后端

若需让后端接收到客户端本不携带、但由 Nginx 根据域名“注入”的请求头(例如 X-Tenant-ID),需组合使用 map 和 proxy_set_header:

先在 http 块定义:map $host $x_tenant_id {<br> tenant-a.example.com "tenant-a";<br> tenant-b.example.com "tenant-b";<br>} 在对应 server 的 location 中:proxy_set_header X-Tenant-ID $x_tenant_id; 注意:该 Header 对客户端不可见(是发给后端的),如需同时返回给客户端,额外加一行 add_header X-Tenant-ID $x_tenant_id;

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。