如何使 Tomcat 8.5 RewriteValve 与 AJP1.3 JKMount 一起工作?
How to make Tomcat 8.5 RewriteValve work with AJP1.3 JKMount?
前提
在安装了最新 Apache2 的 Ubuntu 16.04 服务器上,我有不同的虚拟主机,
每个虚拟主机都正确配置(并使用 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/
.[=36= 中包含的静态站点]
然后我 installed Tomcat 8.5.9 and secured it with a reverse proxy,因此添加:
<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
我希望 运行 myApp.war
在 tomcat/webapps
; 下发布
尝试的解决方案
我的想法如下:
使 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:
我通过添加阀门编辑了 tomcat/conf/server.xml
:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
. . .
<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
</Host>
我创建了一个 tomcat/conf/Catalina/localhost/rewrite.config
文件,其中包含正确的规则(已测试 here):
RewriteRule ^dynamic/(.+)$ /
出于某种原因,这不起作用。 Tomcat 的 RewriteValve 规则要么被忽略,要么发生故障,要么我对整个事情的看法有问题......我不是系统管理员,所以我不会对一些天真的错误感到惊讶这里。
你看出问题出在哪里了吗?或者另一种方法来完成这项工作?
我用 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// [R]
现在可以正常使用了。
前提
在安装了最新 Apache2 的 Ubuntu 16.04 服务器上,我有不同的虚拟主机,
每个虚拟主机都正确配置(并使用 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/
.[=36= 中包含的静态站点]
然后我 installed Tomcat 8.5.9 and secured it with a reverse proxy,因此添加:
<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
我希望 运行myApp.war
在tomcat/webapps
; 下发布
尝试的解决方案
我的想法如下:
使 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:
我通过添加阀门编辑了
tomcat/conf/server.xml
:<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> . . . <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" /> </Host>
我创建了一个
tomcat/conf/Catalina/localhost/rewrite.config
文件,其中包含正确的规则(已测试 here):RewriteRule ^dynamic/(.+)$ /
出于某种原因,这不起作用。 Tomcat 的 RewriteValve 规则要么被忽略,要么发生故障,要么我对整个事情的看法有问题......我不是系统管理员,所以我不会对一些天真的错误感到惊讶这里。
你看出问题出在哪里了吗?或者另一种方法来完成这项工作?
我用 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// [R]
现在可以正常使用了。