gpt4 book ai didi

java - 在 Apache 2 代理 (mod_proxy) 后面的 Tomcat Web 应用程序中发送重定向

转载 作者:搜寻专家 更新时间:2023-10-30 19:42:19 25 4
gpt4 key购买 nike

我在 tomcat 上有一个网络应用 http://localhost:8080/WebApp/

我已经配置了 Apache 2 (mod_proy) 以便本地主机可以直接访问 Web 应用程序而无需端口和名称:例如 http://localhost

<VirtualHost localhost:80>
ProxyPreserveHost On
ProxyPass / http://localhost:8080/WebApp/
ProxyPassReverse / http://localhost:8080/WebApp/
</VirtualHost>

index.html 在 http://localhost 上正确显示。但是如果一个 servlet 重定向:

@WebServlet(description = "...", urlPatterns = { "/login" })
public class LoginServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException
{
response.sendRedirect("a.html");
}
}

我使用 URL http://localhost/login - 我被重定向到 http://localhost/WebApp/a.html

如何获得到 http://localhost/a.html 的正确重定向?

最佳答案

感谢 Stuart 和他指向此博客的链接,我找到了解决方案: Reverse Proxying Tomcat Web Applications Behind Apache

解决方案:必须关闭ProxyPreserveHost!

原因:如果开启,代理后端返回的响应头将包含“localhost”或没有端口号(或80)的真实域。所以 ProxyPassReverse pattern 不匹配(因为端口不同,如果使用其他域名,域名也不会匹配)。

配置:

<VirtualHost localhost:80>

ProxyPreserveHost Off
ProxyPass / http://localhost:8080/WebApp/
ProxyPassReverse / http://localhost:8080/WebApp/

</VirtualHost>

但这只能通过 http,而不是通过 ajp(我不知道为什么)。如果您仍然想使用 ajp,您可以使用以下解决方法 - 让 Apache 在错误的重定向之后再做一次重定向:

<VirtualHost localhost:80>

ProxyPass /WebApp !
ProxyPass / ajp://localhost:8009/WebApp/
ProxyPassReverse / ajp://localhost:8009/WebApp/

RedirectMatch 301 ^/WebApp/(.*)$ /$1
RedirectMatch 301 ^/WebApp$ /

</VirtualHost>

ProxyPass/WebApp ! 指令需要从 mod_proxy 中的进一步处理中排除路径(因为代理指令在重定向指令之前评估)

然后 RedirectMatch 指令将所有带有 /WebApp/... 的内容分别重定向 /WebApp 到没有 /WebApp 的 URL 开头。

唯一的缺点是您的 Web 应用程序中不能有任何名为 WebApp 的子文件夹

关于java - 在 Apache 2 代理 (mod_proxy) 后面的 Tomcat Web 应用程序中发送重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18333252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com