Апач проксировать запросы корень поддомена


Описание

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

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

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

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

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

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

Случай Использования A

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

  • Проксируется до:
    "http://internal:8080/foo-website/index.html"

Пример Использования B

  • Request:
    "http://foo.domain.com/webservice/listener.html?param1=foo&param2=bar"

  • Проксированный чтобы:
    "http://internal:8080/foo-webservice/listener.HTML-код?param1=foo&param2=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 не полностью удовлетворен
  • индекс.формат html в foo-сайт загружается, но ни один из файлов в папках js, img или css.
3 4

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/

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

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

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