2012-12-15 149 views
2

如果我錯過了一些簡單的事情,儘管我努力嘗試設置測試服務器,但我仍然決不是配置Apache的專家,請原諒我。Apache:正常虛擬主機的一個子域,其他虛擬主機的其他子域

背景

我有兩個要求:

  1. 請求subdomain.domain.com應該從/var/www/html/subdomain
  2. 請求中投放的code.domain.com應該由另一臺服務器在同一系統上處理,用不同的端口。請注意,code是一個固定的子域,不應該按照與第一個要求相同的規則進行處理。換句話說,mysite.domain.com應該來自/var/www/html/mysite,而xyz.domain.com應該來自/var/www/html/xyz,但是code.domain.com的處理方式完全不同。

事情試過

要做到#1,我用VirtualDocumentRoot /var/www/html/%1。對於#2,我只想要code子域使用完全不同的配置,使用ProxyPassProxyPassReverse將流量重定向到端口5000上相同系統上的另一臺服務器。

結果

所有請求都根據第一<VirtualHost>容器經由代理指示重定向,即使所使用的子域是NOT code

儘管code虛擬主機是第一個在配置中,但如果子域不是code,則不應使用它,因爲客戶端請求的ServerName不是code.domain.com

問題

我如何調和這兩種配置,這樣一個特定子域使用一個虛擬主機,而其他子域使用其他虛擬主機?

配置

<VirtualHost *:80> 
    ServerName code.domain.com 
    ServerAlias code.local 
    ServerAdmin [email protected] 
    DocumentRoot /var/www/repos 
    ErrorLog logs/code.domain.com 
    CustomLog logs/code-access common 
    ProxyPass/http://localhost:5000/ 
    ProxyPassReverse/http://localhost:5000/ 
    <Directory "/var/www/repos"> 
     DAV On 
     Options +Indexes +FollowSymLinks 
     AllowOverride All 
     Allow from all 
     Order allow, deny 
    </Directory> 
</VirtualHost> 

<VirtualHost *:80> 
    UseCanonicalName Off 
    VirtualDocumentRoot /var/www/html/%1 
    VirtualScriptAlias /var/www/html/%1/cgi-bin 
    LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon 
    CustomLog logs/access_log vcommon 
    ServerName domain.com 
    ServerAlias localhost 
    ServerAdmin [email protected] 
</VirtualHost> 
+0

爲什麼不直接讓代碼子域指向另一個IP? – rekire

+0

感謝您的意見。假設我只有一個盒子和NIC可以工作,那還能繼續嗎?回想一下其他服務器在同一個系統上運行。 –

回答

0

我發現了一個配置,對我來說很漂亮。我刪除整個虛擬主機的配置,取而代之的是:

<VirtualHost *:80> 
    ServerAdmin [email protected] 
    VirtualDocumentRoot /var/www/html/%-3+ 
    ServerName domain.com 
    ServerAlias localhost 
    CustomLog logs/domain.com-access "%V -> %[email protected]%h (%t): %Bb %Dmu" 
    ErrorLog logs/error_log 
</VirtualHost> 

在/var/www/html/code/.htaccess,我使用P標誌的mod_rewrite來代理我的交通需要。

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteRule ^(.*)$ http://localhost:5000/$1 [L,P] 
</IfModule> 

VirtualDocumentRoot採用%-3+意味着I can also use more than one dot在我的URL訪問目錄的名稱中的一個點。例如,可使用anothersite.com.domain.com訪問anothersite.com的測試服務器,並從/var/www/html/anothersite.com提供文件。

有兩個卡口:

  1. 使用通配符CNAME記錄這隻作品。
  2. www.domain.comdomain.com請求的行爲有所不同。
0

上懸而未決你的問題應該不會太難。

首先交換兩個虛擬主機。第一個是每一個默認的。因此,如果沒有規則匹配,則每個呼叫都作爲此虛擬主機處理。

其次讓mod重寫將請求移動到正確的目錄或爲每個有效的域創建一個虛擬主機。最後一個更簡單,並允許你有單獨的日誌文件。

+0

假設我使用第二個虛擬主機作爲默認值,我仍然可以使用ProxyPass將流量發送到.htaccess中的其他端口嗎? –

+0

如果我不錯過應該工作的東西。如果它遇到麻煩,我會盡力幫助你,當我在我的電腦上。在移動設備上編寫服務器配置很困難。 – rekire

相關問題