Virtualhost
僅在存在合適的文件根目錄時使用 VirtualDocumentRoot
我想建立一個環境,可以在不重新載入配置的情況下動態創建 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 以幫助設置虛擬主機的地方。