Apache httpd 后面的 Tomcat – 忽略 RewriteRule?

Apache httpd 后面的 Tomcat – 忽略 RewriteRule?

我有一个相当常见的设置,在 apache httpd 后面使用 mod_proxy 设置 tomcat 应用服务器。我的虚拟主机如下所示:

<VirtualHost test.example.be:80>
    ServerName test.example.be
    RewriteEngine on
    RewriteRule ^/test/(.*)$ /$1
    ProxyRequests Off
    ProxyPreserveHost On

    <Proxy *>
            Order deny,allow
            Allow from all
    </Proxy>
    ProxyPass / http://localhost:8181/test/
    ProxyPassReverse / http://localhost:8181/test/
</VirtualHost>

部署在 tomcat 中的应用程序“test”使用上下文感知框架 (spring security),因此在重定向时会将上下文根添加到前面。因此,当它重定向到位于根目录中的名为 foo.html 的页面时,它会重定向到 bleh://test.example.com/test/foo.html。此 URL 不存在,并给出 404。由于我无法控制上下文根的添加,我认为我可以使用 mod_rewrite 来解决这个问题,方法是删除上下文根。不幸的是,这不起作用:就好像 RewriteRule 被完全忽略了一样。

我确实注意到了一件奇怪的事情:对 bleh://test.example.com/test/foo.html 的请求甚至不会被转发到 tomcat:我从 apache httpd 获得了熟悉的 404 页面。如果我输入任何其他虚假网址,如 bleh://test.example.com/jfaklkfdjljfkl,我会从 tomcat 获得 404 页面。我期望 bleh://test.example.com/test/foo.html 会产生对 bleh://localhost:8181/test/test/foo.html 的调用,但显然我在这里遗漏了一些东西。

我远非这些问题的专家,因此如果能得到任何帮助我都会非常感激。

更新

我在这个问题上取得了一些进展。有人告诉我可以记录 mod_rewrite 的调试输出,所以我就这么做了。以下是这些日志的相关部分:

[12/Oct/2011:10:57:09 +0200] [test.example.be/sid#7b1bc8][rid#820520/initial] (2) init rewrite engine with requested uri /test/notify
[12/Oct/2011:10:57:09 +0200] [test.example.be/sid#7b1bc8][rid#820520/initial] (3) applying pattern '^/test/(.*)$' to uri '/test/notify'
[12/Oct/2011:10:57:09 +0200] [test.example.be/sid#7b1bc8][rid#820520/initial] (2) rewrite '/test/notify' -> '/notify'
[12/Oct/2011:10:57:09 +0200] [test.example.be/sid#7b1bc8][rid#820520/initial] (2) local path result: /notify
[12/Oct/2011:10:57:09 +0200] [test.example.be/sid#7b1bc8][rid#820520/initial] (2) prefixed with document_root to /usr/local/apache/htdocs/notify
[12/Oct/2011:10:57:09 +0200] [test.example.be/sid#7b1bc8][rid#820520/initial] (1) go-ahead with /usr/local/apache/htdocs/notify [OK]

所以这里发生的事情是,mod_rewrite 正在做它应该做的事情,但出于某种原因,apache 不会将 url 传递给 mod_proxy,而是在前面添加 /usr/local/apache/htdocs 并尝试解决该问题。所以新的问题是:我如何让 apache 不添加 /usr/local/apache/htdocs 而只是将 url 传递给 tomcat?

附言:我不得不在几个地方将“http”替换为“bleh”,因为显然您可以发布的链接数量是有限的。

答案1

只需使用[P]将请求传递给 mod_proxy 的标志:

RewriteRule ^/test/(.*)$ http://localhost:8181/$1 [P]

答案2

不添加 DocumentRoot 的正确方法是使用 RewriteBase 指令,或者将 PT(PassThrough)标志添加到重写规则中。请参阅此处 - httpd.apache.org/docs/current/rewrite/flags.html#flag_pt

相关内容