Apache-2.2

使用 Apache 和 mod_proxy 重寫子域的 URL

  • February 9, 2014

我有一個帶有 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">

希望這些資訊在某個時候對某人有所幫助..

最良好的祝愿

引用自:https://serverfault.com/questions/565064