У меня довольно обычная настройка сервера приложений 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>
Приложение «test», развернутое в tomcat, использует среду (безопасность Spring), которая учитывает контекст и, таким образом, добавляет корень контекста в начало при перенаправлении. Итак, когда он перенаправляется на страницу с именем 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» в нескольких местах, потому что, по-видимому, количество ссылок, которые вы можете разместить, ограничено.
Просто используйте [P]
флаг для передачи запроса в mod_proxy:
RewriteRule ^/test/(.*)$ http://localhost:8181/$1 [P]
Правильный способ не добавлять DocumentRoot в начало - использовать директиву RewriteBase или добавить флаг PT (PassThrough) в ваше правило перезаписи. См. Здесь - httpd.apache.org/docs/current/rewrite/flags.html#flag_pt