gpt4 book ai didi

apache - 使用 mod_proxy_ajp 在 Apache 后面正确设置 Tomcat

转载 作者:行者123 更新时间:2023-11-29 00:00:53 25 4
gpt4 key购买 nike

我一直在修补 Apache + Tomcat,这样我就可以通过 apache(干净清晰的 urls rock)为多个 tomcat 应用程序(在不同的机器上)提供服务。我已成功配置 mod_proxy_ajp & mod_rewrite以至于我可以在不同的机器上提供两个 tomcat 应用程序,几乎没有问题。

我发现的唯一问题是其中一个应用程序(我在 Struts2 中开发)有很多链接和表单,它们是用 <s:a /> 生成的, <s:url /><s:form />标签。这些标签生成的url一般是这样的:

/WebApp/path/to/some.action

多亏了 ModRewrite 的魔力,这通常不是一个问题,并且指向此类 url 的超链接会被快速重写并重定向到 /app/path/to/some.action (尽管我确实收到了大量 302 回复)。

真正的问题出现在执行 POST 请求时。众所周知,我无法重定向 POST使用 mod_rewrite 请求...所以最后...我所有的 POST请求不起作用,因为 mod_rewrite 重定向到正确的 url 但作为 GET请求。

我已经阅读了一些关于 mod_proxy_html 的内容以及它如何帮助我重写 Tomcat Web 应用程序返回的 url...但感觉很麻烦。

这是我当前的 apache 配置:

## HACKING BEGINS RIGHT HERE

# cookies
ProxyPassReverseCookiePath /WebApp /app
# this is for CSS, IMGs, JS and redirecting urls with /WebApp*
RewriteRule ^/WebApp(.*)$ /app$1 [R,L]
<Location /app>
ProxyPass ajp://localhost:8009/WebApp
ProxyPassReverse ajp://localhost:8009/WebApp
Order allow,deny
Allow from all
</Location>

# the other app
ProxyPassReverseCookiePath /WebApp2 /other
<Location /other>
ProxyPass ajp://200.9.4.6:8009/WebApp2
ProxyPassReverse ajp://200.9.4.6:8009/WebApp2
Order allow,deny
Allow from all
</Location>

我的POST一定有解决办法请求问题...有什么想法吗?我能以某种方式配置一些允许 Struts2 输出正确 url 的东西吗?

感谢您的帮助。

最佳答案

可能有几种方法可以解决这个问题。

如果您能够使用您在 URL 中使用的相同名称将您的应用程序部署到 Tomcat,那将是最简单的。因此,您的应用程序 app 将是 /webapps/app[.war] 而不是 /webapps/WebApp,这将完全避免重写。

否则,以下应该有效,并且应该在您当前的重写规则之前。 [PT] 应该 允许 Apache 仍然代理请求(这在使用 mod_jk 时有效,不确定我是否使用/测试过它mod_proxy_ajp):

RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^/WebApp(.*)$ /app$1 [PT,L]

一旦您的 bean 处理了 POST 请求,您就可以将请求发送到将被重定向的 URL。最后,POST URL 对用户来说并不重要,因此它不必是一个漂亮的 URL。

以下编辑:

我在 Apache mod_proxy 上看到,ProxyPassReverse 应该使用 [PT] 标志。而且我能够复制您遇到的问题,并且下面的配置适用于我的基本 JSP 页面,该页面具有发布到另一个 JSP 页面的表单。

<VirtualHost *:80>
ServerName localhost
RewriteEngine On

RewriteCond %{REQUEST_METHOD} !POST
RewriteRule /WebApp/(.*) /app/$1 [R,L]

RewriteCond %{REQUEST_METHOD} POST
RewriteRule /WebApp/(.*) /app/$1 [PT,L]

<Location /app>
ProxyPass ajp://localhost:8109/WebApp
ProxyPassReverse ajp://localhost:8109/WebApp
</Location>
</VirtualHost>

关于apache - 使用 mod_proxy_ajp 在 Apache 后面正确设置 Tomcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5486719/

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