Apache2 别名被忽略:“文件不存在”,尽管没有尾随斜杠并且启用了重写

Apache2 别名被忽略:“文件不存在”,尽管没有尾随斜杠并且启用了重写

在 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指令并为其分配不同的名称。

相关内容