Domain-Name-System

不同的子域,apache 使用相同的 vhost 響應

  • January 28, 2015

我在 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

除了這個問題,我有兩個建議

  1. 添加ServerNameApache 為請求提供服務的主機的 FQDN。這將幫助您避免很多麻煩。
  2. 如果所有子域都有不同的 IP 地址,則使用基於 IP 的虛擬化而不是基於名稱。

您的VirtualHost配置看起來很完美,看起來並沒有造成問題。

Apache 文件指出.

如果在包含最具體匹配 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 標頭。

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