如何让tomcat 5.5在apache 2后面运行,mod_rewrite将请求传递给mod_jk并剥离应用程序上下文?

StackOverflow https://stackoverflow.com/questions/208261

好的,所以我想在tomcat(5.5)中运行一个webapp来运行从站点的根目录(即没有上下文)的apache 2(准确地说是2.2.3),并提供静态内容通过apache。

因此,如果应用程序在“ / myapp ”下运行在tomcat上我想使用apache(加上 mod_rewrite )使其行为就好像它在“ / ”下运行一样代替。

Mod_jk 已设置并正常工作。我可以从“ / myapp ”访问该应用程序,但我无法完成最后一点工作。下面是我为 mod_rewrite 获得的配置,试图让它工作。它正确地重写 / static / url以获取apache从解压缩的webapp服务它们,如果我启用重写日志,我看到它确实尝试将所有其他请求传递给 / myapp 通过 mod_jk 。但是,似乎mod_jk之后没有处理请求。


JkMount /myapp/*      worker1

RewriteEngine On

# ensure static stuff gets served by apache
RewriteRule ^/static/(.*)$ /var/lib/tomcat5.5/webapps/myapp/static/$1 [L]
# everything else should go through tomcat
RewriteRule ^/(.*)$ /myapp/$1 [L,PT]

当我使用apache 1完成此操作时,我必须确保 mod_jk mod_rewrite 之前加载,但我似乎无法实现这在apache 2.下有什么想法吗?其他人通常如何做到这一点?

有帮助吗?

解决方案

管理最终使这项工作。看来我需要将JkOption设置为:


JkOptions     +ForwardURICompat

然后 mod_jk 查看重写的URL。必须承认不是100%确定为什么这样做,但我相信它正在恢复旧的行为形式。如果有人能告诉我更好/更正确的做法,我很乐意知道。

其他提示

可能更好地使用Apache代理而不是mod_jk。 像这样:

ProxyPass / static / http:// localhost:8080 / myapp / static /

如果您为不同的主机使用Tomcat虚拟主机或不同的连接器,只是部署根应用程序(在“/”)并将Apache mod_jk转发到不同的连接器或虚拟主机,可能会更容易或更透明

注意:当我需要这个时,我使用不同的连接器为不同的tomcat主机或引擎(不记得)和部署的ROOT应用程序。我从未在tomcat中尝试过虚拟主机(基于名称),只是猜测这可行。

好处:没有路径转换,因此在初始部署后必须对安装月进行更改后,更容易理解。

我承认,感觉有些奇怪,但可读性的好处对我来说非常值得。

我们使用'R'标志而不是'PT':

RewriteRule ^/(.*)$ /myapp/$1 [L,R]

修改 我错过了不改变用户看到的URL的观点。另一种方法是:

JkMount /* worker1
JkUnmount /static/* worker1

然后你不会需要RewriteRule。

根据 Apache Tomcat网站 的新默认设置mod_jk mod_rewrite 不兼容,您应该使用 + ForwardURICompatUnparsed

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top