У меня есть веб-сервер 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">
Надеюсь, эта информация когда-нибудь кому-нибудь поможет ..
С наилучшими пожеланиями