2009-02-15 71 views
14

在Linux系統上使用Apache2有沒有辦法讓多個VirtualDocumentRoot使用mod_vhost_aliasApache Multiple VirtualDocumentRoot

這我目前使用的,想被命名約定繼續使用:

host     directory 
127.0.0.1 domain  domain.com 
127.0.0.1 sub.domain domain.com_sub 

然後在我的虛擬主機httpd.conf中的部分我:

NameVirtualHost 127.0.0.1 

<VirtualHost 127.0.0.1> 
    VirtualDocumentRoot /var/www/%0.0.com 
</VirtualHost> 

<VirtualHost 127.0.0.1> 
    VirtualDocumentRoot /var/www/%2.0.com_%1 
</VirtualHost> 

的問題這是當我訪問sub.domain的Apache錯誤日誌顯示它正在尋找/var/www/sub.domain.com而不是/var/www/domain.com_test,這導致我相信它只讀取第一條規則和然後失敗,但我想要做的是使用任何滿足任何文檔根兩個VirtualDocumentRoot規則。

+4

,但我已低於完整性,因爲這出現在谷歌搜索。 您可能想將此問題標記爲已回答? – starmonkey 2010-03-24 07:29:09

回答

13

Apache通常會選擇第一個虛擬主機,它的ServerNameServerAliasHost HTTP標頭中提供的主機名相匹配。在你的情況下,因爲你沒有ServerName指令,Apache應該使用IP地址上的反向DNS查找來僞造服務器名稱,並假設反向DNS導致domain.com,這不匹配,Apache默認爲第一個虛擬主機。聽起來很複雜,我知道......底線是,你應該使用ServerNameServerAlias來明確配置。嘗試更多的東西是這樣的:

NameVirtualHost 127.0.0.1 
<VirtualHost 127.0.0.1> 
    ServerName domain.com 
    ServerAlias www.domain.com 
    VirtualDocumentRoot /var/www/%0 
</VirtualHost> 
<VirtualHost 127.0.0.1> 
    ServerName sub.domain.com 
    ServerAlias *.domain.com 
    VirtualDocumentRoot /var/www/%2.%3_%1 
</VirtualHost> 

應使用/var/www/domain.comhttp://domain.com/var/www/www.domain.comhttp://www.domain.com,這兩者都是由第一虛擬主機服務,併爲/var/www/sub.domain.comhttp://sub.domain.com/var/www/blah.domain.comhttp://blah.domain.com,等等。

+0

這節省了我的一天。我使用VirtualDocumentRoot定義在兩個VirtualHost文件之間切換。我知道必須有一個更好的方法,你找到了它。謝謝! – 2014-02-05 16:02:34

2

關於OP與「/ VAR問題/ www/html等「正在設置:

我不得不這樣做的問題是使用%1而不是%2。這是我的工作示例:

ServerAlias www.*.org.au 
UseCanonicalName Off 
VirtualDocumentRoot /path/to/sites/%2/pub 

希望能幫助別人!

我在mod_vhost_alias docs上閱讀了「目錄名插值」上的文檔。

4

當您想要放置'。'時,您必須限定反向引用。在文件路徑中。所以你需要像這樣:

VirtualDocumentRoot /var/www/%2.0.%3_%1 
0

我終於找到了一個允許靈活的子域創建的配置。

查看mod_vhost_alias

apache的文檔如果您的根域開發有3個部分,如dev.example。com可以使用%-4+作爲根域之前所有內容的佔位符。如果它有4個零件,請使用%-5+

<VirtualHost *:80> 
    VirtualDocumentRoot "/var/www/%-4+/webroot" 
    ServerName www.dev.example.com 
    ServerAlias *.dev.example.com 
    php_admin_value auto_prepend_file /var/www/setdocroot.php 
</VirtualHost> 

這樣你可以創建一個名爲/var/www/sub.domain/webroot目錄,並與URL sub.domain.dev.example.com訪問它。

php_admin_value auto_prepend_file /var/www/setdocroot.php修復像OSX 10.9+

這裏是一些系統的文檔根線是setdocroot.php內容:我假設你解決了這個問題

<?php 
$_SERVER['DOCUMENT_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['SCRIPT_FILENAME']); 
?>