多个域名共用一组代理和后端时,后端通常依靠HTTP主机名选择虚拟主机、租户或应用配置。代理如果改写Host,可能命中默认站点;如果原样接受所有客户端转发头,则可能让用户伪造外部域名。正确做法是定义每一跳的主机名来源和信任边界。
HTTP Host表示请求所针对的主机名,可能包含端口。TLS握手中的SNI在HTTP请求到达之前用于选择证书。代理连接后端时可以把Host保持为用户访问的域名,也可以改成内部服务名。X-Forwarded-Host通常用于让应用了解外部原始主机名,但它不是天然可信的协议字段。HTTPS路由要同时考虑SNI、代理上游TLS名称和HTTP Host。
先明确应用需要依据哪个值生成绝对链接、执行租户路由和设置Cookie域。如果应用使用原始域名,应让可信代理传入并覆盖相应头;如果后端只识别规范服务名,则应一致改写Host,并通过受信转发头传递外部名称。🧱
curl -H 'Host: shop.example.test' http://127.0.0.1/,确认预期站点命中。若后端直连正确、经过代理后错误,优先检查上游Host改写和转发头;若TLS阶段即呈现错误证书,应检查SNI和证书选择,而不是只改HTTP路由。🧪
只对明确需要原域名路由的上游保留Host。若需改写,应固定使用规范名称,并确保应用不会把内部服务名当成公开域名输出。反向代理应覆盖客户端传入的X-Forwarded-Host等头,而不是无条件追加或信任;同时为允许域名建立明确列表,对未知Host返回拒绝或安全默认页。Host头可影响路由和链接生成,必须视为输入数据。
为每个授权域名验证正确站点、证书、重定向、绝对链接和Cookie域属性;再使用未知Host确认不会访问到敏感默认虚拟主机。检查应用日志中的原始Host和可信代理链,确认伪造客户端转发头不会改变路由。多域名逐一通过、未知主机被安全处理,才算代理路由闭环。📋