在 Ubuntu 2016.04 的默认 Apache2 中,我尝试添加一个带有别名的虚拟主机:
sudo mkdir /var/www/simplesamlphp
echo "Hello" > /var/www/simplesamlphp/index.html (as root)
sudo chown -R www-data:www-data /var/www/simplesamlphp
sudo chmod -R 755 /var/www
其次,我创建了/etc/apache2/sites-available/simplesamlphp.conf
:
<VirtualHost *>
ServerName simplesamlphp
DocumentRoot /var/www/simplesamlphp
SetEnv SIMPLESAMLPHP_CONFIG_DIR /var/simplesamlphp/config
Alias /simplesaml /var/simplesamlphp/www
<Directory /var/simplesamlphp/www>
<IfModule !mod_authz_core.c>
# For Apache 2.2:
Order allow,deny
Allow from all
</IfModule>
<IfModule mod_authz_core.c>
# For Apache 2.4:
Require all granted
</IfModule>
</Directory>
</VirtualHost>
第三,我将这一行添加到/etc/hosts
:
127.0.0.1 simplesamlphp
第四,我跑了:
sudo a2enmod rewrite
sudo a2ensite simplesamlphp.conf
sudo service apache2 restart
问题:访问http://simplesamlphp/simplesaml
给出The requested URL /simplesaml was not found on this server
并出现在/var/log/apache2/error.log
:
AH00128: File does not exist: /var/www/html/simplesaml
我做错了什么?
顺便说一下,我正在关注这些说明。实际上,我不确定为什么尽管所有内容都在 中,但仍需要 DocumentRoot /var/simplesamlphp/www
。
答案1
读者须知:请阅读 Henning Kockerbeck 的评论。Apache 2.4 虚拟主机功能在官方指南。以下答案已过时。
该程序为何有效的最佳解释如下(来自文档):
当请求到达时,服务器将根据请求使用的 IP 地址和端口找到最佳(最具体)匹配参数。如果有多个虚拟主机包含此最佳匹配地址和端口组合,Apache 将进一步将 ServerName 和 ServerAlias 指令与请求中存在的服务器名称进行比较。
如果您没有禁用默认站点,那么
000-default
您现在有两个<VirtualHost *>
声明,并且默认声明不是基于名称的。Apache 无法区分它们,为了解决歧义,它将忽略第二个声明。您可以采用三种不同的方式进行:
- 您可以选择禁用默认网站,或者
- 您可以选择让新的虚拟主机监听不同的端口,或者
- 您可以选择将默认站点转换为基于名称的虚拟主机,方法是编辑
000-default.conf
、取消注释ServerName
指令并为其分配不同的名称。