如何在不实际更改 Apache 中的 URL 的情况下将请求转发到另一个 URL?

如何在不实际更改 Apache 中的 URL 的情况下将请求转发到另一个 URL?

例如,我在域中运行 Apache http://example.com。我的服务器上还运行 Tomcat,并且我已将所有请求转发给http://example.com/t/Tomcat,而所有其他 URL 均由 Apache 直接提供服务。

我的问题是我有一个类似的 URL http://example.com/bar,但它实际上应该指向http://example.com/t/bar

换句话说,该 URL 应该由 Tomcat 处理,并获得应用程序上下文“bar”。

问题是,我不太清楚如何为此制定正确的重写规则。我尝试将其添加到 sites-available/default

RewriteEngine 开启
重写规则 ^/bar(.*) /t/bar$1 [R]

但这不会保留 URL,而只是重定向到带有前缀的 Tomcat URL /t/。如果我删除[R],则只会得到 404。

什么方法RewriteRule可以正确解决我的问题?

答案1

您应该在 mod_rewrite 规则中使用“P”(代理)选项,以便在服务器内部完成。您还需要启用mod_proxy

来自mod_rewrite 文档

‘proxy|P’(强制代理)

此标志强制将替换部分作为代理请求在内部发送,并立即(重写处理在此停止)通过代理模块。您必须确保替换字符串是有效的 URI(通常以 http://主机名) 可以由 Apache 代理模块处理。否则,您将收到来自代理模块的错误。使用此标志可以实现更强大的 ProxyPass 指令实现,以将远程内容映射到本地服务器的命名空间中。

注意:必须启用 mod_proxy 以便使用该标志。

相关内容