Назад | Перейти на главную страницу

Перезапись URL для поддомена с Apache и mod_proxy

У меня есть веб-сервер Apache с mod_proxy и сервер Tomcat с запущенным веб-приложением Grails. Apache перенаправляет через прокси запрос на example.com:80 на мой Tomcat, работающий на example.com:8008.

Мне нужно перенаправить запросы следующим образом:

http://subdomain1.example.com:80/some-nice-seo-url

от apache должен получить прокси на

http://example.com:8008/some-nice-seo-url-subdomain1

Как я могу заархивировать это с помощью следующей конфигурации apache2:

NameVirtualHost *:80

<VirtualHost *:80>
        ServerName example.com
        ServerAlias www.example.com
        <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>

        # compress text, html, javascript, css, xml:
        AddOutputFilterByType DEFLATE text/plain
        AddOutputFilterByType DEFLATE text/html
        AddOutputFilterByType DEFLATE text/xml
        AddOutputFilterByType DEFLATE text/css
        AddOutputFilterByType DEFLATE application/xml
        AddOutputFilterByType DEFLATE application/xhtml+xml
        AddOutputFilterByType DEFLATE application/rss+xml
        AddOutputFilterByType DEFLATE application/javascript
        AddOutputFilterByType DEFLATE application/x-javascript

        ExpiresActive On
        ExpiresByType text/html "access plus 7 days"
        ExpiresByType image/gif "access plus 1 months"
        ExpiresByType image/jpeg "access plus 1 months"
        ExpiresByType image/png "access plus 1 months"
        ExpiresByType text/css "access plus 14 days"
        ExpiresByType text/javascript "access plus 14 days"
        ExpiresByType application/x-javascript "access plus 14 days"
        ExpiresByType image/ico "access plus 1 months"

        RewriteEngine on
        # www to non-www using search-engine friendly 301
        RewriteCond %{HTTP_HOST} ^www.example.com [NC]
        RewriteRule ^(.*)$ http://example.com$1 [L,R=301]

        # IP canonicalization
        RewriteCond %{HTTP_HOST} ^1\.2\.3\.4
        RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]


        <Directory />
                Options FollowSymLinks
                 AllowOverride None
        </Directory>
        <Directory /opt/example/web-app>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        # redirect everything else to TOMCAT
        ProxyPass               / http://1.2.3.4:8008/
        ProxyPassReverse        / http://1.2.3.4:8008/
        ProxyPassReverseCookieDomain localhost example.com
        ProxyPreserveHost On
</VirtualHost>

Спасибо за любую помощь!

Хорошо, я запустил ...

Ключевые элементы, для которых выполняются следующие условия mod_rewrite

    RewriteCond   %{HTTP_HOST} ^((?!www\.)[^.]+)\.example\.com$
    RewriteCond %{REQUEST_URI} ^/some.+$
    RewriteRule   ^(.+)  %{HTTP_HOST}$1  [C]
    RewriteRule   ^([^.]+)\.example\.com(.*) http://example.com:8008$2-$1 [P]
    ProxyPassReverse http://example.com/ http://example.com:8008/

Первое условие указывает серверу Apache перехватывать все URL-адреса, которые обращаются к субдомену, кроме субдомена www.

Второе условие сообщает Apache, что запрошенный путь (URI) должен начинаться со специального индикатора. В моем примере это «некоторые». Это важно, иначе все css / images / js и т. Д. Подпадают под это условие перезаписи, и мой tomcat не доставит все это.

теперь есть две строчки правил перезаписи. Первый соответствует субдомену и сохраняет его в переменной $ 1. Второй соответствует URI и сохраняет его в $ 2. После второго правила перезаписи я говорю системе, как создать новый URL:

http://example.com:8008$2-$1 [P]

Здесь я перенаправляю на сервер Tomcat, работающий в моей системе. Возможно, можно использовать IP вместо имени домена. [P] указывает системе использовать mod_proxy для перенаправления трафика.

В последней строке мы определяем ProxyPassReverse для восстановления всех ссылок в ответном документе, поступающих от прокси и идущих в клиентский браузер - так что все http://example.com:8008 якоря возвращаются к http://subdomain1.example.com.

У меня возникли проблемы с моей конфигурацией tomcat при использовании вышеуказанного кода. Флаг [P] не сохраняет исходный хост. Из-за этого мне пришлось изменить в tomcat server.xml хост по умолчанию для моего используемого движка:

 <Engine name="Catalina" defaultHost="example.com">

Надеюсь, эта информация когда-нибудь кому-нибудь поможет ..

С наилучшими пожеланиями