如何使Tomcat 8.5 RewriteValve使用AJP1.3 JKMount?

前提

在安装了最新Apache2的Ubuntu 16.04服务器上,我有不同的虚拟主机,
每个人都正确configuration(并使用Let's Encrypt进行保护):

  • / etc / apache2 / sites-enabled / my.site.com-le-ssl.conf
  • / etc / apache2 / sites-enabled / my.other.site.com-le-ssl.conf

指向下面的静态内容:

  • /var/www/my.site.com/
  • /var/www/my.other.site.com/

这工作正常
通过调用https://my.site.com/我看到/var/www/my.site.com/包含的静态网站。

然后,我安装了Tomcat 8.5.9并使用反向代理进行了保护 ,因此添加了以下内容:

 <VirtualHost *:443> . . . JKMount /* ajp13_worker . . . </VirtualHost> 

到/ etc / apache2 / sites-enabled / my.site.com-le-ssl.conf

这也工作正常
通过调用https://my.site.com/现在我看到了Tomcat的家。


期望的目标

我想要达到以下结果:

  • 通过调用https://my.site.com/我想看到静态网站( /var/www/my.site.com/ );
  • 通过调用https://my.site.com/dynamic我想看到Tomcat的家;
    因此,通过调用https://my.site.com/dynamic/myApp我希望运行tomcat/webapps下发布myApp.war ;

尝试解决scheme

我的想法如下:

  • 使Apache JKMount只与/dynamic上下文的请求,因此,而不是:

     <VirtualHost *:443> . . . JKMount /* ajp13_worker . . . </VirtualHost> 

    ,我用过:

     <VirtualHost *:443> . . . JKMount /dynamic/* ajp13_worker . . . </VirtualHost> 

这似乎在Apache方面起作用 ; 调用my.site.com将打开静态内容,同时调用my.site.com/dynamic将给予Tomcat 404。

现在,我需要重写URL来删除dynamic上下文,以使其对Tomcat透明,并且我已经尝试了最后3个小时来使用Tomcat RewriteValve进行操作 :

  • 我通过添加Valve编辑tomcat/conf/server.xml

     <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> . . . <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" /> </Host> 
  • 我创build了一个tomcat/conf/Catalina/localhost/rewrite.config文件,包含正确的规则(在这里testing):

     RewriteRule ^dynamic/(.+)$ /$1 

出于某种原因,这是行不通的。 Tomcat的RewriteValve规则要么被忽略,要么发生故障,或者我认为整个事情有什么问题……我不是系统pipe理员,所以我不会因为一些天真的错误而感到惊讶。

你看到问题在哪里? 或另一种方式来使这项工作?

我已经通过使用mod_proxy_ajp而不是mod_jk来解决它。

Apache的my.site.com-le-ssl.conf

 <VirtualHost *:443> . . . ProxyPass /dynamic/ ajp://localhost:8009/ ProxyPassReverse /dynamic/ ajp://localhost:8009/ . . . </VirtualHost> 

Tomcat的rewrite.config

 RewriteRule ^dynamic(.+)$ dynamic/$1/ [R] 

现在它按需要工作。