必须开启 ProxyPreserveHost on,否则 Apache 会将原始 Host 头替换为后端地址(如 localhost:3000),导致后端无法识别真实域名(如 api.example.com),引发 502/400/404 错误;该指令须与 ProxyPass 同作用域(如 <VirtualHost> 内),不可置于全局顶层,且多 ProxyPass 需分别配置,不继承。

必须开启 ProxyPreserveHost on,否则 Apache 会把原始 Host 头替换成后端地址(如 localhost:3000),导致后端收不到用户实际访问的域名(如 api.example.com),常见报错包括 502、400、404,日志里能看到 Host 是内网地址而非真实域名。
配置位置必须和 ProxyPass 在同一作用域
该指令不能写在全局 Server 块顶层,只在启用代理的上下文中生效。常见有效位置有:
-
<VirtualHost *:80>内(最常用) -
<Location /api>块内(路径级代理时) -
<Proxy *>块内(较少用,但合法)
错误示例:把 ProxyPreserveHost on 放在 <VirtualHost> 外面,或写在 httpd.conf 最顶部——此时完全不生效。
最小可用配置示例
以代理 api.example.com 到本地 Node.js 服务为例:
<VirtualHost *:80>
ServerName api.example.com
ProxyPreserveHost on
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
</VirtualHost>
注意:ProxyPassReverse 不可省略,它重写响应头中的 Location、Content-Location 等 URL,否则 302 跳转会暴露内部地址。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
多代理规则需分别设置
如果一个虚拟主机里有多个 ProxyPass,每个都得单独配 ProxyPreserveHost on,它不继承:
- ✅ 正确写法:
ProxyPreserveHost on紧跟在第一个ProxyPass前;第二个ProxyPass前再写一次 - ❌ 错误写法:只写一次,以为能覆盖后续所有代理规则
Apache 不会自动为后续 ProxyPass 补上该行为。
模块和权限前提
确保以下条件已满足,否则配置无效:
- 已启用
mod_proxy和mod_proxy_http(Ubuntu/Debian 执行a2enmod proxy proxy_http) - 未在
.htaccess中尝试使用——这是服务器级指令,.htaccess不支持 -
ServerName必须明确指定,否则虚拟主机匹配可能失败,导致配置未被加载
配置完记得重启 Apache:sudo systemctl restart apache2(Linux)或 httpd -k restart(Windows)。

















