Как пересылать запросы на другой URL, фактически не меняя URL в Apache?

5241
Kim L

У меня Apache работает в домене, например http://example.com. У меня также работает Tomcat на моем сервере, и я перенаправил все запросы, сделанные http://example.com/t/Tomcat, а все остальные URL-адреса обслуживаются Apache напрямую.

Моя проблема в том, что у меня есть URL-адрес http://example.com/bar, но на самом деле он должен указывать на http://example.com/t/bar.

Другими словами, URL должен обрабатываться Tomcat, который получает контекстную панель приложения.

Проблема в том, что я не совсем уверен, как сделать правильное правило переписывания для этого. Я пытался добавить это на сайты доступны / по умолчанию

ПереписатьEngine на RewriteRule ^ / bar (. *) / T / bar $ 1 [R] 

Но это не сохраняет URL-адрес, а просто перенаправляет на URL-адрес Tomcat с /t/префиксом. Если я снимаю [R], то я просто получаю 404.

Как правильно RewriteRuleрешить мою проблему?

0
Вы, вероятно, получите лучшие ответы на serverfault.com MDMarra 14 лет назад 1
Я не понимаю вопроса. Вы говорите «но на самом деле он должен указывать на http://example.com/t/bar», а затем говорите «Но это не сохраняет URL, а вместо этого просто перенаправляет на URL Tomcat с префиксом / t /. " Вы хотите изменить URL или нет? innaM 14 лет назад 0
Манни, простите за сумбур. Нет, я не хочу, чтобы URL изменился. Kim L 14 лет назад 0

1 ответ на вопрос

3
Doug Harris

Вы должны использовать опцию 'P' (прокси) в правиле mod_rewrite, чтобы сделать это внутренне для сервера. Вам также необходимо включить mod_proxy .

из документов mod_rewrite :

'proxy | P' (принудительный прокси)

Этот флаг заставляет замещающую часть внутренне отправляться как запрос прокси-сервера и немедленно (обработка перезаписи останавливается здесь) передаваться через прокси-модуль. Вы должны убедиться, что строка подстановки является допустимым URI (обычно начинающимся с http: // hostname ), который может обрабатываться прокси-модулем Apache. Если нет, вы получите ошибку от прокси-модуля. Используйте этот флаг, чтобы добиться более мощной реализации директивы ProxyPass, чтобы отобразить удаленный контент в пространство имен локального сервера.

Примечание: mod_proxy должен быть включен для использования этого флага.