
我有一台由其他人配置的 Debian 6 伺服器。我被要求在該伺服器上新增一個子網域。
我正確配置了 DNS(使用 檢查nslookup
),建立了目錄,/var/www/
然後新增了新的虛擬主機/etc/apache2/sites-available
(事實上,我複製了現有子網域的檔案之一,並對其進行了編輯):
<VirtualHost *:80>
DocumentRoot "/var/www/mysub.example.com"
ServerName mysub.example.com
ServerAlias www.mysub.example.com
ErrorLog ...[path to file]
CustomLog [path to file]
RewriteEngine On
#RewriteCond %{HTTP_HOST} ^mysub.example.com$ [NC]
#RewriteRule ^(.*)$ http://www.mysub.example.com$1 [R=301,L]
<Directory /var/www/mysub.example.com>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
然後我使用並重新啟動 Apache 新增了主機a2ensite
,但網域mysub.example.com
正在重定向到beta.example.com
我們的測試版生產網站。奇怪的是, beta.example.com
in 中沒有配置/etc/apache2/sites-available
。
我還應該做什麼來啟用這個子網域?我非常確定example.com
主機的配置不會阻止任何內容,因為我們還有一個blog.example.com
以這種方式配置的虛擬主機,而且它運作良好。
編輯
一些調試輸出:
root@xxx:~# apachectl -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:443 beta.example.com (/etc/apache2/sites-enabled/01-example.com:18)
*:80 is a NameVirtualHost
default server beta.example.com (/etc/apache2/sites-enabled/01-example.com:1)
port 80 namevhost beta.example.com (/etc/apache2/sites-enabled/01-example.com:1)
port 80 namevhost blog.example.com (/etc/apache2/sites-enabled/02-blog.example.com:1)
port 80 namevhost [here comes other unrelated domain name]
port 80 namevhost forum.example.com (/etc/apache2/sites-enabled/04-forum.example.com:1)
port 80 namevhost example.com (/etc/apache2/sites-enabled/05-sth.example.com:1)
port 80 namevhost mysub.example.com (/etc/apache2/sites-enabled/06-mysub.example.com:1)
Syntax OK
root@xxx:~# grep -r 'mysub\.example\.com' /etc/apache2
/etc/apache2/apache2.conf:Alias /mysub /var/www/mysub.example.com
/etc/apache2/sites-available/06-mysub.example.com: DocumentRoot "/var/www/mysub.example.com"
/etc/apache2/sites-available/06-mysub.example.com: ServerName mysub.example.com
/etc/apache2/sites-available/06-mysub.example.com: ServerAlias www.mysub.example.com
/etc/apache2/sites-available/06-mysub.example.com: ErrorLog "/var/log/apache2/mysub.example.com-error_log"
/etc/apache2/sites-available/06-mysub.example.com: CustomLog "/var/log/apache2/mysub.example.com-access_log" common
/etc/apache2/sites-available/06-mysub.example.com: #RewriteCond %{HTTP_HOST} ^mysub.example.com$ [NC]
/etc/apache2/sites-available/06-mysub.example.com: #RewriteRule ^(.*)$ http://www.mysub.example.com$1 [R=301,L]
/etc/apache2/sites-available/06-mysub.example.com: <Directory /var/www/mysub.example.com>
root@xxx:~# grep -r 'beta\.example\.com' /etc/apache2
/etc/apache2/sites-available/01-example.com: ServerName beta.example.com
/etc/apache2/sites-available/01-example.com: ServerAlias www.beta.example.com
/etc/apache2/sites-available/01-example.com: ErrorLog "/var/log/apache2/beta.example.com-error_log"
/etc/apache2/sites-available/01-example.com: CustomLog "/var/log/apache2/beta.example.com-access_log" common
/etc/apache2/sites-available/01-example.com: ServerName beta.example.com:443
/etc/apache2/sites-available/01-example.com: ServerAlias www.beta.example.com:443
/etc/apache2/sites-available/01-example.com: ErrorLog "/var/log/apache2/beta.example.com-error_log"
/etc/apache2/sites-available/01-example.com: CustomLog "/var/log/apache2/beta.example.com-access_log" common
編輯2
我做了一個快速測試。我禁用了第一個虛擬主機 ( beta.example.com
):
a2dissite 01-example.com
然後嘗試訪問mysub.example.com
,我現在被重定向到blog.example.com
- 這是按啟用站點順序排列的第二個。所以看起來好像mysub.example.com
沒有被發現,它落入了*.example.com
它找到的子域的第一個容器。
編輯2
另一個測試:我更改了設定檔的順序,以便我的新子網域將成為第一個(預設)子網域。現在:
root@xxx:~# apachectl -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:443 beta.example.com (/etc/apache2/sites-enabled/01-example.com:14)
*:80 is a NameVirtualHost
default server mysub.example.com (/etc/apache2/sites-enabled/00-mysub.example.com:1)
port 80 namevhost mysub.example.com (/etc/apache2/sites-enabled/00-mysub.example.com:1)
port 80 namevhost beta.example.com (/etc/apache2/sites-enabled/01-example.com:1)
port 80 namevhost blog.example.com (/etc/apache2/sites-enabled/02-blog.example.com:1)
Syntax OK
儘管如此,如果我嘗試輸入,mysub.example.com
我會被重定向到beta.example.com
.仍然blog.example.com
工作得很好。
是否有可能在其他地方(除了/etc/apache2/sites-available
目錄之外)定義了域配置?
編輯3
主機的其他設定:beta.example.com 和 blog.example.com
beta.example.com (檔案: /etc/apache2/hosts-available/01-example.com )
<VirtualHost *:80>
DocumentRoot "/var/www/example.com"
ServerName beta.example.com
ServerAlias www.beta.example.com
ErrorLog "/var/log/apache2/beta.example.com-error_log"
CustomLog "/var/log/apache2/beta.example.com-access_log" common
<Directory /var/www/example.com>
AllowOverride All
</Directory>
</VirtualHost>
<VirtualHost *:443>
DocumentRoot "/var/www/example.com"
ServerName beta.example.com:443
ServerAlias www.beta.example.com:443
ErrorLog "/var/log/apache2/beta.example.com-error_log"
CustomLog "/var/log/apache2/beta.example.com-access_log" common
RewriteEngine On
#RewriteCond %{HTTP_HOST} ^example.com$ [NC]
#RewriteRule ^(.*)$ http://www.example.com$1 [R=301,L]
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key
<Directory /var/www/example.com>
AllowOverride All
</Directory>
</VirtualHost>
blog.example.com (檔案: /etc/apache2/hosts-available/02-blog.example.com )
<VirtualHost *:80>
DocumentRoot "/var/www/blog.example.com"
ServerName blog.example.com
ServerAlias www.blog.example.com
ErrorLog ...[path to file]
CustomLog [path to file]
RewriteEngine On
#RewriteCond %{HTTP_HOST} ^blog.example.com$ [NC]
#RewriteRule ^(.*)$ http://www.blog.example.com$1 [R=301,L]
<Directory /var/www/blog.example.com>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
答案1
我建議您調試所有文件,正如 c4f4t0r 所說,嘗試“apache2ctl -S”,然後嘗試在 .htaccess 文件中查找重寫規則,例如:
find /var/www/mysub.example.com -name ".htaccess" -exec grep -l -i rewrite {} \;
在你的主設定檔中有一些「危險」的東西:
<Directory /var/www/mysub.example.com>
AllowOverride All # <---- THIS
Require all granted
</Directory>
答案2
您應該檢查該文件/etc/apache2/ports.conf
並查看NameVirtualHost *:80
附近的行Listen 80
如果沒有這一行,則無法使用基於 ServerName 的虛擬主機,因此瀏覽器中始終獲得第一個啟用的虛擬主機是正常的。
答案3
好吧,問題(和解決方案)非常簡單。
問題是新建立的子網域資料夾是空的 - 其中沒有 index.php/html 檔案。因此,伺服器沒有顯示它(作為目錄),而是重定向到預設網域 - 這是beta.example.com
因此,虛擬主機的配置是正確的,並且在向資料夾添加一些檔案後,子網域開始工作。