我在 Ubuntu 14.04 的安装上使用 Apache 2.4,并且正在配置 Apache“虚拟主机”,以便能够为不同的主机名提供不同的内容。
我正在尝试配置 Apache,以便当有人尝试使用主机名访问服务器时(www.)example1.com
,将提供来自的内容/var/www/example1
;但是,如果有人尝试使用其 IP 地址或除之外的任何其他主机名访问服务器(www.)example1.com
(例如,通过 IP 直接访问它,或通过指向该 IP 的任何其他主机名访问它),/var/www/html
则将提供来自的内容。
我在以下位置有以下配置文件/etc/apache2/sites-available
:
/etc/apache2/sites-available/example1.conf
:
<VirtualHost example1.com:80>
DocumentRoot /var/www/example1
ServerAlias www.example1.com
ErrorLog ${APACHE_LOG_DIR}/ex1_error.log
CustomLog ${APACHE_LOG_DIR}/ex1_access.log combined
</VirtualHost>
/etc/apache2/sites-available/000-default.conf
:
<VirtualHost *:80>
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
但是,当我尝试通过直接访问或通过指向此 IP 的其他主机名访问该网站时,我获得来自/var/www/example1
而不是来自提供的内容/var/www/html
。
这可能是什么问题?我该如何解决?
答案1
在 2.4 版中使用_default_
:
<VirtualHost _default_:*>
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
答案2
您可以用它alias *
来捕获任何其他请求,但它必须是最后一个虚拟主机。
针对你的情况,你可以这样做:
重命名并编辑 /etc/apache2/sites-available/000-example1.conf:
<VirtualHost *:80>
DocumentRoot /var/www/example1
ServerName www.example1.com
ErrorLog ${APACHE_LOG_DIR}/ex1_error.log
CustomLog ${APACHE_LOG_DIR}/ex1_access.log combined
</VirtualHost>
重命名并编辑 /etc/apache2/sites-available/001-default.conf:
# /!\ THIS HAS TO BE ON THE LAST POSITION /!\
<VirtualHost *:80 *:443>
ServerName localhost
ServerAlias *
DocumentRoot /var/www/html/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
您甚至可以重命名001-default.conf
为100-default.conf
,这样下次您将有一个新的虚拟主机,如002-newhost1.conf, 003-newhost2.conf, etc
默认将停留在最后一个位置,并且永远不会接受“任何其他”请求。