Правильно настройте Tomcat за Apache с помощью mod_proxy_ajp - PullRequest
0 голосов
/ 30 марта 2011

Я возился с Apache + Tomcat, чтобы я мог обслуживать несколько приложений tomcat (на разных машинах) через apache (чистые и четкие URL-адреса).Я успешно настроил mod_proxy_ajp & mod_rewrite до такой степени, что могу обслуживать два приложения tomcat на разных машинах с почти без проблем.

Единственная проблема, которую я обнаружил, эточто одно из приложений (которое я разрабатываю в Struts2) имеет множество ссылок и форм, которые генерируются с помощью тегов <s:a />, <s:url /> и <s:form />.URL-адреса, сгенерированные этими тегами, обычно выглядят так:

/WebApp/path/to/some.action

Благодаря магии ModRewrite это, как правило, не проблема big и гиперссылки натакие URL-адреса быстро переписываются и перенаправляются на /app/path/to/some.action (хотя я получаю тонны 302 ответов).

Настоящая проблема возникает при выполнении запросов POST.Как вы все знаете, я не могу перенаправить POST запросы с помощью mod_rewrite ... так что в итоге ... все мои POST запросы не работают, потому что mod_rewrite перенаправляет на правильный URL-адрес, но как запрос GET.

Я уже немного прочитал о mod_proxy_html и о том, как он может помочь мне переписать URL-адреса, возвращаемые веб-приложением Tomcat ... но это доставляет неприятности.

Это мой текущийКонфигурация apache:

## HACKING BEGINS RIGHT HERE

# cookies
ProxyPassReverseCookiePath /WebApp /app
# this is for CSS, IMGs, JS and redirecting urls with /WebApp*
RewriteRule ^/WebApp(.*)$ /app$1 [R,L]
<Location /app>
    ProxyPass ajp://localhost:8009/WebApp
    ProxyPassReverse ajp://localhost:8009/WebApp
    Order allow,deny
    Allow from all
</Location>

# the other app
ProxyPassReverseCookiePath /WebApp2 /other
<Location /other>
    ProxyPass ajp://200.9.4.6:8009/WebApp2
    ProxyPassReverse ajp://200.9.4.6:8009/WebApp2
    Order allow,deny
    Allow from all
</Location>

Должно быть решение моей проблемы POST запросов ... Есть идеи?Можно ли как-то настроить что-то, что позволит Struts2 выводить правильные URL-адреса?

Спасибо за вашу помощь.

Ответы [ 3 ]

0 голосов
/ 30 июня 2012

Это проблема с настройкой веб-приложения; может быть способ обойти это в конфигурации httpd, но он чище, чтобы исправить первоначальное несоответствие, а не взламывать его.

Также стоит отметить, что Struts пытается помочь вам, предоставляя вам контекстно-зависимые, не относительные URL-адреса; если вы просто сопоставите пути, вы можете положиться на это (вместо того, чтобы бороться с этим ...).

Итак, просто разверните веб-приложение Struts в / app и / other вместо / WebApp и / WebApp2. (Возможно, по какой-то причине это невозможно - например, если вы на самом деле не контролируете эти другие серверы - но, похоже, это не относится).

0 голосов
/ 01 октября 2012

Я бы не стал переписывать URL. Он просто открывает банки таких червей, заставляет вас заглянуть в mod_proxy_html и т. Д., Которые, конечно, являются еще более червями. Вместо этого просто разверните свои приложения в Tomcat с реальными URL-адресами, которые вы можете использовать как видимые извне.

0 голосов
/ 30 марта 2011

Может быть несколько способов сделать это.

Если вы сможете развернуть свое приложение в Tomcat под тем же именем, которое вы используете в URL, это будет проще всего. Таким образом, ваше приложение app будет /webapps/app[.war] вместо /webapps/WebApp, это позволит избежать перезаписи в целом.

В противном случае, следующее должно работать, и должно идти до вашего текущего правила перезаписи. [PT] должен позволить Apache все еще прокси-запрос (это работает при использовании mod_jk, не уверен, что я использовал / проверял его с mod_proxy_ajp):

RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^/WebApp(.*)$ /app$1 [PT,L]

Как только ваш компонент обработает запрос POST, вы можете отправить запрос по URL, который будет перенаправлен. В конце концов, POST URL не имеет значения для пользователя, поэтому он не обязательно должен быть красивым.

Правки ниже:

Я видел в Apache mod_proxy, что ProxyPassReverse должен работать с флагом [PT]. И я смог воспроизвести проблему, с которой вы столкнулись, и приведенный ниже конфиг работал для меня с базовой страницей JSP с формой, размещенной на другой странице JSP.

<VirtualHost *:80>
    ServerName localhost
    RewriteEngine On

    RewriteCond %{REQUEST_METHOD} !POST
    RewriteRule /WebApp/(.*) /app/$1 [R,L] 

    RewriteCond %{REQUEST_METHOD} POST
    RewriteRule /WebApp/(.*) /app/$1 [PT,L]

    <Location /app>
        ProxyPass ajp://localhost:8109/WebApp
        ProxyPassReverse ajp://localhost:8109/WebApp
    </Location>
</VirtualHost>
...