从虚拟主机的URL中删除Tomcat上下文(mod_jk,mod_rewrite)

Ric*_*d H 6 apache mod-rewrite tomcat mod-jk virtual-hosts

我有一个包含许多webapp的Tomcat实例,每个都可以通过它的/ Context访问.Tomcat是httpd(实际上是Debian Apache2)的后面,配置了虚拟主机来为每个app/Context提供服务.Tomcat连接与mod_jk连接.

当我不关心从URL中删除上下文时,这很好用:当请求虚拟域的根时,请求被重定向到domain.com/Context.

但是对于一个应用程序,我确实想要删除上下文.我相信这可以通过使用mod_rewrite,并将重写的url传递给mod_jk以传递给正确的Tomcat上下文来完成.所以我的Debian Apache2站点可用文件如下所示:

NameVirtualHost *

<VirtualHost *>
    ServerName domain.be

    DocumentRoot /home/webapp/app/static/domain/

    RewriteEngine on
    RewriteRule ^/(.*)$ /Context/$1 [L,PT]
    RewriteLog "/var/log/apache2/domain-rewrite.log"
    RewriteLogLevel 4

    JkLogFile     /var/log/apache2/domain-mod_jk.log
    JkLogLevel    debug
    JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
    JkMount /Context w1
    JKMount /Context* w1
    JkOptions +ForwardURICompat

    ErrorLog /var/log/apache2/domain_error.log
    CustomLog /var/log/apache2/domain_access.log combined
    LogLevel warn

</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

根据文档,[PT]标志和+ ForwardURICompat选项应该导致重写的URL传递给jk_mod.然而,这似乎并没有发生.

正在重写URL,但似乎mod_jk忽略了它:例如,对domain.be/Context的请求被重写为/ Context/Context - 但仍然作为/ Context传递给mod_jk.

有任何想法吗?顺便说一下,我现在不能使用mod_proxy.

谢谢

Jos*_*son 2

我一直在使用这个并取得了巨大成功:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/(Context/.*)$
RewriteRule ^/(.*)$ /Context/$1 [P,L]
Run Code Online (Sandbox Code Playgroud)

关于您的情况的注释:

  • 您需要让 mod_proxy 正常工作,否则[P]将被忽略,并且请求将被转发而不是被代理。这是没有办法解决的。
  • +ForwardURICompat是mod_jk的一部分,重写后生效。
  • mod_jk 忽略该请求,因为它永远不会到达那里。您需要RewriteCond(上面)来防止对 /Context 的请求被重写。

我目前正在寻找一种无需 mod_rewrite 即可完成此操作的方法,而是仅使用 mod_jk 和 Tomcat <Host>'s。但是我在 apache、mod_jk 和 Tomcat 主机无法很好地协同工作时遇到了问题。上面的内容应该适合你。