如何使用 ProxyPassReverse 重写根相对重定向而不影响绝对重定向?

如何使用 ProxyPassReverse 重写根相对重定向而不影响绝对重定向?

我有许多 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/"

相关内容