Virtualhost

在存在合適的文件根目錄時使用 VirtualDocumentRoot

  • March 3, 2018

我想建立一個環境,​​可以在不重新載入配置的情況下動態創建 Apache 虛擬主機。

我可以用mod_vhost_alias做到這一點,我設置我的預設虛擬主機是這樣的

<VirtualHost *>
 UseCanonicalName Off
 VirtualDocumentRoot /var/www/sandboxes/domains/%0
 ServerName catchall.host
</VirtualHost>

這工作得很好,但如果請求目前未設置的主機名,我會收到 404 Not Found 錯誤。

真正想做的只是只有在文件根存在時才啟動這個 VirtualHost *,*否則讓它嘗試匹配另一個 vhost(換句話說,使VirtualDocumentRoot的存在以與使用相同的方式工作伺服器別名)

我嘗試將其設為第二個虛擬主機,第一個虛擬主機只處理所有請求,但這不起作用 - 對配置了 VirtualDocumentRoot 的域的請求落入預設虛擬主機。

那麼,我怎樣才能動態配置虛擬主機,但對於尚未配置的任何虛擬主機都回退到另一個虛擬主機?

我找到了一個適合我的解決方法。

我可以使用ErrorDocument來獲取 PHP 腳本中的 404 錯誤。起初,這似乎有問題。如果沒有 DocumentRoot,腳本將在哪裡?

我可以使用來自不同域的錯誤消息的 URL。但是,在測試中,我發現無法知道最初請求的域是什麼。

答案是別名目錄並提供錯誤,所以我的虛擬主機看起來像這樣

<VirtualHost *>
 UseCanonicalName Off
 VirtualDocumentRoot /var/www/sandboxes/domains/%0
 ServerName catchall.host
 Alias /errors /var/www/default/errors/
 ErrorDocument 404 /errors/notfound.php
</VirtualHost>

現在,當請求未配置的域時,將呼叫 /var/www/default/errors/notfound.php 處的腳本。這個腳本可以檢查 $_SERVER

$$ ‘HTTP_HOST’ $$查看請求的域。如果它實際配置,那麼我們有一個正常的 404。如果它沒有配置,我們可以顯示一些替代錯誤消息。就我而言,它是我顯示 UI 以幫助設置虛擬主機的地方。

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