2013-10-08 61 views
2

我想阿帕奇以下方式工作:的Apache的mod_proxy與mod_rewrite的不同服務器保留URL

  1. 用戶類型user1.app.com到地址欄。
  2. DNS有一個將所有內容轉發到SERVER1的通配符
  3. SERVER1已運行Apache,它將使用重寫映射將user1映射到IP地址xxx.xxx.xxx。
  4. 阿帕奇供應來自xxx.xxx.xxx所有內容,同時保留URL user1.app.com

我已經嘗試做這幾種方式:

方法1:

RewriteRule ^(.*) http://xxx.xxx.xxx:port/ [P] 

結果:重定向循環,遠程IP訪問少數幾次(可以通過查看遠程服務器上的日誌進行確認)。 SERVER1的日誌顯示以下的重複:

proxy: *: found reverse proxy worker for http://xxx.xxx.xxx/ 
mod_proxy.c(1020): Running scheme http handler (attempt 0) 
mod_proxy_http.c(1973): proxy: HTTP: serving URL http://xxx.xxx.xxx/ 
proxy_util.c(2011): proxy: HTTP: has acquired connection for (*) 
proxy_util.c(2067): proxy: connecting http://xxx.xxx.xxx/ to xxx.xxx.xxx:80 
proxy_util.c(2193): proxy: connected/to xxx.xxx.xxx:80 
proxy_util.c(2444): proxy: HTTP: fam 2 socket created to connect to * 
proxy_util.c(2576): proxy: HTTP: connection complete to xxx.xxx.xxx:80 (xxx.xxx.xxx) 
mod_proxy_http.c(1743): proxy: start body send 
mod_proxy_http.c(1847): proxy: end body send 
proxy_util.c(2029): proxy: HTTP: has released connection for (*) 

方法2:

<VirtualHost *:801> 
ServerName SERVER1 

ProxyRequests Off 

ProxyPreserveHost On 

<Proxy *:801> 
    Order deny,allow 
    Allow from localhost 
</Proxy> 

ProxyPass/http://xxx.xxx.xxx/ 
ProxyPassReverse/http://xxx.xxx.xxx/ 
LogLevel debug 
</VirtualHost> 

RewriteRule ^(.*) http://127.0.0.1:801/ [PT] 

結果:400錯誤的請求 用方法2,我可以去SERVER 1:801在我的瀏覽器中,一切按預期工作。

任何幫助非常感謝! 在此先感謝!

+0

對此問題的任何更新?我相信這個:http://stackoverflow.com/questions/11936922/apache-rewrite-or-proxy應該是有幫助的。 –

回答

0

該解決方案最終被幾個不同的工具在Apache的組合:

  • 使用一個文本文件的每個子域映射到相應的IP
  • 環境變量的插值來訪問子域在代理重定向(不得不用ProxyPassInterpolateEnv Oninterpolate關鍵字在ProxyPassProxyPassReverse語句的結束)

阿帕奇:

ProxyRequests Off 
ProxyPreserveHost On 

<Proxy *> 
    Order deny,allow 
    Allow from localhost 
</Proxy> 

RewriteEngine On 

ProxyPassInterpolateEnv On 
RewriteMap subdomains txt:/directory/clients.txt 
RewriteCond %{HTTP_HOST} ^(.*)\.application\.com 
RewriteRule^- [E=SERVER_NAME:${subdomains:%1}] 

RewriteCond %{REQUEST_URI} !(\.[^./]+)$ 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ %{REQUEST_URI}/ [R] 

ProxyPass/http://${SERVER_NAME}/ interpolate 
ProxyPassReverse/http://${SERVER_NAME}/ interpolate 
+0

client.txt看起來像什麼? – Jeroen

+1

示例文件(每個子域/ IP對是在其自己的行): 子域192.168.1.1 subdomain2 192.168.1.2 subdomain3 192.168.1.3 – user2030173

+0

備忘錄自己:如果你使用上面,循環回服務器,當你有這個,請記住明確定義VHOST中的一個serveralias,否則你有一個無限的代理循環。 – Jeroen