Apache 子域配置不起作用
我有一個由其他人配置的 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>
然後我使用
a2ensite
Apache 添加了我的主機並重新啟動,但域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>
我建議您調試所有文件,正如 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>
您應該檢查文件
/etc/apache2/ports.conf
並查看NameVirtualHost *:80
附近的行Listen 80
如果你沒有這條線,你就不能使用基於 ServerName 的虛擬主機,所以你總是在瀏覽器中獲得第一個啟用的虛擬主機是正常的。