不同的子域,apache 使用相同的 vhost 響應
我在 Digital Ocean 中有一個 VPS,執行 ubuntu 14.04 和 apache 2.4.7,DNS 也在 DO 中管理。
我有一個域,我們稱之為 thedomain.com 我一直在嘗試配置 3 個子域以及主域(thedomain.com、calis.thedomain.com、orlybg.thedomain.com、fubar.thedomain.com)。
我無法在瀏覽器中正確配置我的 apache 的虛擬主機,無論是哪個域/子域,我總是得到同一個虛擬主機(我可以通過 apache 日誌知道)和瀏覽器中的 otput 的響應。
主域和 3 個子域是 A 記錄 www 是 CNAME,這是我的區域文件:
$ORIGIN thedomain.com. $TTL 1800 thedomain.com. IN SOA ns1.digitalocean.com. hostmaster.thedomain.com. 1422028092 10800 3600 604800 1800 thedomain.com. 1800 IN NS ns1.digitalocean.com. thedomain.com. 1800 IN NS ns2.digitalocean.com. thedomain.com. 1800 IN NS ns3.digitalocean.com. thedomain.com. 1800 IN A 104.236.80.93 www.thedomain.com. 1800 IN CNAME thedomain.com. orlybg.thedomain.com. 1800 IN A XXX.XXX.XX.XX fubar.thedomain.com. 1800 IN A XXX.XXX.XX.XX calis.thedomain.com. 1800 IN A XXX.XXX.XX.XX
我將主主機和 3 個子域作為 4 個單獨的虛擬主機文件,我啟用了這 3 個:
calis.thedomain.com.conf
<VirtualHost *:80> ServerName calis.thedomain.com DocumentRoot /var/www/html/calis <Directory /var/www/html/calis> # enable the .htaccess rewrites AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error_calis.log CustomLog ${APACHE_LOG_DIR}/access_calis.log combined </VirtualHost>
thedomain.com.conf
<VirtualHost *:80> ServerName thedomain.com DocumentRoot /var/www/html/thedomain <Directory /var/www/html/thedomain> # enable the .htaccess rewrites AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
orlybg.thedomain.com.conf
<VirtualHost *:80> ServerName orlybg.thedomain.com DocumentRoot /var/www/html/myproject <Directory /var/www/html/myproject> # enable the .htaccess rewrites AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error_orlybg.log CustomLog ${APACHE_LOG_DIR}/access_orlybg.log combined </VirtualHost>
我使用 a2ensite 啟用虛擬主機,啟用了 vhost_alias.load,我以多種方式重新啟動/重新載入 apache,但沒有運氣。我看到我的 apache 版本中沒有使用 NameVirtualHost 指令,我曾經有一個帶有 ServerName localhost 的 conf 文件,看不到“無法可靠地確定伺服器的完全限定域名”錯誤,但我禁用了它。
apachectl -S
VirtualHost configuration: *:80 is a NameVirtualHost default server calis.thedomain.com (/etc/apache2/sites-enabled/calis.thedomain.com.conf:1) port 80 namevhost calis.thedomain.com (/etc/apache2/sites-enabled/calis.thedomain.com.conf:1) port 80 namevhost thedomain.com (/etc/apache2/sites-enabled/thedomain.com.conf:1) port 80 namevhost orlybg.thedomain.com (/etc/apache2/sites-enabled/orlybg.thedomain.com.conf:1) ServerRoot: "/etc/apache2" Main DocumentRoot: "/var/www" Main ErrorLog: "/var/log/apache2/error.log" Mutex watchdog-callback: using_defaults Mutex rewrite-map: using_defaults Mutex default: dir="/var/lock/apache2" mechanism=fcntl Mutex mpm-accept: using_defaults PidFile: "/var/run/apache2/apache2.pid" Define: DUMP_VHOSTS Define: DUMP_RUN_CFG User: name="www-data" id=33 Group: name="www-data" id=33
我不知道接下來要嘗試什麼,我已經嘗試了好幾天了。我真的很感激任何幫助,謝謝!
最後,我的一個朋友看到我在 vhosts 中有錯字,他在 /etc/hosts 中添加了一些帶有域和伺服器 IP 的條目
thedomain.com XXX.XXX.XX.XX www.thedomain.com XXX.XXX.XX.XX orlybg.thedomain.com XXX.XXX.XX.XX calis.thedomain.com XXX.XXX.XX.XX
除了這個問題,我有兩個建議
- 添加
ServerName
Apache 為請求提供服務的主機的 FQDN。這將幫助您避免很多麻煩。- 如果所有子域都有不同的 IP 地址,則使用基於 IP 的虛擬化而不是基於名稱。
您的
VirtualHost
配置看起來很完美,看起來並沒有造成問題。如果在包含最具體匹配 IP 地址和埠組合的虛擬主機集中沒有找到匹配的 ServerName 或 ServerAlias,則將使用第一個列出的匹配的虛擬主機。
通常
VirtualHost
根據Host:
HTTP 標頭選擇不同的部分,如果沒有VirtualHost
部分與Host:
標頭匹配,則第一部分將被視為預設部分,並將被提供。哪個反過來取決於您如何在瀏覽器中發出請求。你用curl
命令檢查它以確定是什麼導致了下面的問題。$ curl -L http://localhost -H 'Host: thedomain.com'
這應該從
/var/www/html/thedomain
.$ curl -L http://localhost -H 'Host: orlybg.thedomain.com'
這應該從
/var/www/html/myproject
.在這裡,
-H
我們可以使用選項發送自定義 http 標頭,因此在這裡我們使用它來發送Host:
http 標頭。