Apache прокси-запросы корневых поддоменов - PullRequest
4 голосов
/ 25 марта 2012

Описание

  • Внутренний сервер Tomcat, который прослушивает веб-приложения на 8080:

    "http://internal:8080/foo-webservice/"
    "http://internal:8080/foo-website/"

  • Внешний сервер Apache направляет запросы на поддомен:

    "http://foo.domain.com/"

  • Любые запросы корня субдомена будут перенаправляться в веб-приложение foo-сайта на Tomcat.

  • Любые другие запросы будут перенаправлены на соответствующий путь / веб-приложение

Вариант использования A

Вариант использования B

Определение VirtualHost

  • Текущее определение виртуального хоста, которое удовлетворяет варианту использования B:

    <VirtualHost *:80>
        ServerName foo.domain.com
    
        ProxyRequests Off
    
        <Proxy *>
            Order deny,allow
            Allow from all
        </Proxy>
    
        ErrorLog /var/log/apache2/foo_error.log
        LogLevel warn
        CustomLog /var/log/apache2/foo_access.log combined
    
        # RewriteRules
        # ?
    
        # ProxyPass
        ProxyPreserveHost On
        ProxyPass        / http://internal:8080/
        ProxyPassReverse / http://internal:8080/
    </VirtualHost>
    

Попытка 1

    # RewriteRules
    RewriteEngine On
    RewriteRule ^/(.*) http://internal:8080/foo-website/$1 [P]
  • Вариант использования А удовлетворен
  • Сбой варианта использования B

Попытка 2

    # RewriteRules
    RewriteEngine On
    RewriteRule ^/$ http://internal:8080/foo-website/$1 [P]
  • Вариант использования B удовлетворен
  • Вариант использования A не полностью удовлетворен
  • Файл index.html в foo-website загружен, но ни один из файлов в папках js, img или css.

Ответы [ 3 ]

2 голосов
/ 26 марта 2012

Правила ProxyPass совпадают по порядку

 ProxyPass        /webservice/ http://internal:8080/foo-webservice/
 ProxyPassReverse /webservice/ http://internal:8080/foo-webservice/

 ProxyPass        /website/ http://internal:8080/foo-website/
 ProxyPassReverse /website/ http://internal:8080/foo-website/

 ProxyPass        / http://internal:8080/foo-website/
 ProxyPassReverse / http://internal:8080/foo-website/

Нет правила перезаписи.Разве это не достаточно хорошо?

0 голосов
/ 26 марта 2012
  • Я думаю, что проблема с Попыткой 2 (ни один из файлов в папках js, img или css не был сопоставлен) был признаком того, что мой подход был неправильным.

  • Мое решение теперь состоит в том, чтобы перенаправить любые запросы в корень, на foo-website webapp.

            <VirtualHost *:80>
                    ServerName foo.domain.com
    
                    ProxyRequests Off
    
                    <Proxy *>
                            Order deny,allow
                            Allow from all
                    </Proxy>
    
                    ErrorLog /var/log/apache2/foo_error.log
                    LogLevel warn
                    CustomLog /var/log/apache2/foo_access.log combined
    
                    # RewriteRules
                    RewriteEngine On
                    RewriteRule   ^/$  /foo-website/  [R]
    
                    # ProxyPass
                    ProxyPreserveHost On
                    ProxyPass        / http://internal:8080/
                    ProxyPassReverse / http://internal:8080/
            </VirtualHost>
    
  • Это было не то, что я изначально хотел, но я думаю, что это разрешение.

0 голосов
/ 25 марта 2012

Я думаю, что вам нужно использовать первую попытку, но включить флаг QSA (добавление строки запроса) в квадратные скобки в конце каждой директивы RewriteRule.

...