我一直在修补Apache + Tomcat,这样我就可以通过apache(干净和清晰的网址摇滚)为多个tomcat应用程序(在不同的机器中)提供服务。我已成功配置mod_proxy_ajp
& mod_rewrite
我可以在不同的机器上为两个tomcat应用程序提供服务,几乎没有麻烦。
我发现的唯一问题是其中一个应用程序(我在Struts2中开发)有很多链接和表单,这些链接和表单是使用<s:a />
,<s:url />
和{生成的{1}}标签。这些标签生成的网址通常如下:
<s:form />
感谢ModRewrite的神奇之处,这通常不是 big 问题,而且这些网址的超链接很快就被重写了。重定向到/WebApp/path/to/some.action
(虽然我收到了大量的/app/path/to/some.action
回复)。
执行POST请求时会出现真正的问题。正如大家可能知道的那样,我无法使用mod_rewrite重定向302
个请求...所以最后...我的所有POST
请求都不起作用,因为mod_rewrite重定向到正确的url但是作为POST
请求。
我已经阅读了一些关于GET
的内容以及它如何帮助我重写Tomcat Web应用程序返回的URL ...但是感觉很麻烦。
这是我目前的apache配置:
mod_proxy_html
我的## 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>
请求问题必须有解决方案......任何想法?我能以某种方式配置一些允许Struts2输出正确URL的东西吗?
感谢您的帮助。
答案 0 :(得分:0)
可能有几种方法可以解决这个问题。
如果您能够使用与URL中使用的名称相同的名称将应用程序部署到Tomcat,那将是最简单的。因此,您的应用app
将是/webapps/app[.war]
而不是/webapps/WebApp
,这样可以完全避免重写。
否则,以下内容应该有效,并且应该在当前的重写规则之前进行。 [PT]
应该允许Apache仍然代理请求(这在使用mod_jk
时有效,不确定我是否使用mod_proxy_ajp
进行了测试:< / p>
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>
答案 1 :(得分:0)
这是webapp设置的问题;可能有一种方法可以在httpd配置中解决它,但修复原始的不一致与黑客攻击更加清晰。
另外值得一提的是,Struts正试图通过为您提供上下文感知的非相对URL来帮助您;如果你只是让路径匹配,你可以依靠它(而不是与它战斗......)。
因此,只需将Struts webapp部署到/ app和/ other,而不是/ WebApp和/ WebApp2。 (可能有一些原因这是不可能的 - 比如如果你实际上没有控制其他服务器 - 但听起来不适用)。
答案 2 :(得分:-1)
我会避免重写网址。它只是打开这样的蠕虫,让你看看mod_proxy_html等,这当然只是更多的蠕虫。相反,只需在Tomcat中部署您的应用程序,即可在外部看到您可以使用的真实URL。