Apache проксирует корневые запросы поддомена

Описание

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

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

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

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

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

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

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

  • Запрос:
    "http://foo.domain.com/index.html"

  • Проксировано на:
    "http://internal:8080/foo-website/index.html"

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

  • Запрос:
    "http://foo.domain.com/webservice/listener.html?param1=foo¶m2=bar"

  • Проксировано на:
    "http://internal:8080/foo-webservice/listener.html?param1=foo¶m2=bar"

Определение виртуального хоста

  • Текущее определение виртуального хоста, удовлетворяющее варианту использования 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]
  • Вариант использования A удовлетворен
  • Вариант использования B не работает

Попытка 2

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

person Gordo    schedule 25.03.2012    source источник


Ответы (3)


Правила 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/

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

person Bruno Grieder    schedule 26.03.2012
comment
Спасибо, я был занят переписыванием, когда мне это не нужно. - person Gordo; 27.03.2012

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

person James C    schedule 25.03.2012
comment
Я устал: RewriteRule ^/(.*) http://internal:8080/foo-website/$1 [QSA,P] Но результаты были те же. - person Gordo; 25.03.2012

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

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

            <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>
    
  • Это было не то, что я изначально хотел, но я думаю, что это решение.

person Gordo    schedule 26.03.2012