我有许多 Web 应用程序需要位于反向代理后面,如下所示:
http://example.com/app1/
=> http://appserver.example:8801/
http://example.com/app2/
=>http://appserver.example:8802/
这些应用程序使用两种类型的重定向:
- 根目录相对重定向,例如
/foo
,需要映射回http://example.com/app1/foo
- 绝对重定向,例如
http://external.example/bar
,需要保持不变
我目前有一组通过宏定义的代理规则,如下所示:
<Macro AppProxy $alias $target>
RewriteRule "^/$alias$" "/$alias/" [R=308,L]
<Location /$alias/>
ProxyPass http://$target/
ProxyPassReverse http://$target/
ProxyPassReverse /
ProxyPassReverseCookiePath / /$alias/
</Location>
</Macro>
值得注意的是,我希望该ProxyPassReverse /
指令能够实现我的目标。然而,实际发生的是,它还修改了绝对重定向:
/foo
正确映射到http://example.com/app1/foo
http://external.example/bar
是错误地映射到http://example.com/app1/bar
我需要做什么才能保留第一个映射但避免第二个映射?
不完全相关,但外部重定向是联合身份验证所必需的,例如通过 SAML 与客户 IdP 进行身份验证。内部重定向在应用程序中使用,我们宁愿在反向代理级别处理重新映射,也不愿让应用程序本身担心其面向公众的 URL 实际上是什么。
看起来这是一个已知错误在 httpd 2.4 中,但自 2014 年报告以来一直没有任何活动,所以此时我正在寻找实现合理重定向重写的替代方案。
答案1
作为一种解决方法,可以Location
使用以下方法手动重写响应标头mod_headers
:
Header edit Location "^/" "/$alias/"