在Apache HTTP Server中,代理传递域名通常指通过反向代理(Reverse Proxy)转发请求时,如何将客户端原始请求的Host头(域名信息)正确传递给后端服务器。默认情况下,Apache在代理请求时会使用后端服务器配置的地址作为Host头,这可能导致后端基于域名进行路由或生成重定向URL时出现问题。为此,Apache提供了ProxyPreserveHost指令来控制Host头的传递行为。

核心配置示例:
ProxyPreserveHost On:启用后,Apache会将客户端原始请求中的Host头原样传递给后端服务器。这是最常用的“传递域名”方式,可确保后端识别到正确的域名。配置通常与ProxyPass和ProxyPassReverse配合使用,例如:
ProxyPreserveHost On ProxyPass / http://192.168.1.10:8080/ ProxyPassReverse / http://192.168.1.10:8080/
上述配置中,所有访问Apache的请求都会被转发到后端服务器,同时保留原始的Host头(如www.example.com)。ProxyPassReverse用于重写后端返回的HTTP重定向响应中的Location头,使其指向原始域名,避免客户端被引导至内部地址。
需要注意的细节:
1. ProxyPreserveHost默认值为Off,即默认不传递原始域名,而是使用ProxyPass中指定的后端主机名作为Host头。如果后端依赖域名进行虚拟主机选择或URL生成,必须显式开启此指令。
2. 如果使用mod_proxy并配置了虚拟主机(VirtualHost),ProxyPreserveHost On可使后端感知到客户端访问的是哪个虚拟主机的域名,从而实现多域名共用同一后端服务的场景。
3. 对于HTTPS请求,Apache还会传递X-Forwarded-Proto和X-Forwarded-Host头(需配置mod_headers),但Host头本身仍由ProxyPreserveHost控制。
4. 如果后端需要记录客户端的原始IP,应同时配置mod_remoteip或使用X-Forwarded-For头,但这与域名传递是不同维度的问题。
此外,若需要修改或重写传递的域名,可以使用mod_proxy的ProxyPass参数或mod_rewrite的[P]标志配合Host头重写,但一般简单场景中推荐保持ProxyPreserveHost On。若后端服务器要求Host头必须是某个内部名称(而非客户端域名),则可保持Off,并在ProxyPass中使用指定的后端主机名。
总而言之,Apache代理传递域名的核心是ProxyPreserveHost指令,正确设置后即可实现透明传递客户端请求的域名,保障基于域名的应用逻辑正常运行。

查看详情

查看详情