Tomcat за Apache httpd - игнорируя RewriteRule?

У меня довольно распространенная настройка сервера приложений tomcat за apache httpd с использованием mod_proxy. Мой виртуальный хост выглядит так:

<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: я получаю знакомую страницу 404 от apache httpd. Если я введу любой другой поддельный URL, например bleh://test.example.com/jfaklkfdjljfkl, я получу страницу 404 от tomcat. Я ожидал бы, что 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?

PS: мне пришлось заменить "http" на "bleh" в нескольких местах, потому что очевидно, что количество ссылок, которые вы можете публиковать, ограничено.

2 ответа

Решение

Просто используйте [P] флаг для передачи запроса к mod_proxy:

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

Правильный способ отказаться от добавления DocumentRoot - использовать директиву RewriteBase или добавить флаг PT (PassThrough) в правило перезаписи. Смотрите здесь - httpd.apache.org/docs/current/rewrite/flags.html#flag_pt

Другие вопросы по тегам