使用 Apache 和 mod_proxy 重寫子域的 URL
我有一個帶有 mod_proxy 的 Apache Web 伺服器和一個執行我的 Grails Web 應用程序的 Tomcat 伺服器。Apache 正在使用代理將對 example.com:80 的請求重定向到我在 example.com:8008 上執行的 Tomcat。
我需要通過以下方式重定向請求:
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 不會提供所有這些東西。
現在有兩行重寫規則。第一個匹配子域並將其保存在var中 $ 1. The second one matches the URI and saves it in $ 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 $$flag 不保留原始主機。因此,我必須在 tomcat server.xml 中更改我使用的引擎的預設主機:
<Engine name="Catalina" defaultHost="example.com">
希望這些資訊在某個時候對某人有所幫助..
最良好的祝愿