具有动态子域的 Apache 虚拟主机

具有动态子域的 Apache 虚拟主机

我的目标是能够创建 2 个虚拟主机,其中一个对应于开发环境,另一个对应于我本地 ubuntu 16.04 机器中的测试环境。此应用程序的一个特殊之处是它必须支持动态子域。其中一些是固定的,如登录和管理子域,但每个用户也会有自己的子域。此虚拟主机适用于开发环境:

<VirtualHost *:80>
        ServerName myapp.local
        ServerAlias *.myapp.local
        DocumentRoot /var/www/myapp/web
        <Directory /var/www/myapp/web/>
            AllowOverride All
            Require local
        </Directory>
        ErrorLog /var/www/myapp/logs/error.log
        CustomLog /var/www/myapp/logs/access.log combined
</VirtualHost>

现在我希望能够为测试版本拥有一个虚拟主机并通过此 URL 访问它:login.test.myapp.local、admin.test.myapp.local,... 这是我拥有的虚拟主机,它仍然不起作用,因为请求此时总是落在第一个虚拟主机中:

<VirtualHost *:80>
        ServerName test.myapp.local
        ServerAlias *.test.myapp.local
        DocumentRoot /var/www/test.myapp/web
        <Directory /var/www/test.myapp/web/>
            AllowOverride All
            Require local
        </Directory>
        ErrorLog /var/www/test.myapp/logs/error.log
        CustomLog /var/www/test.myapp/logs/access.log combined
</VirtualHost>

我知道我需要告诉第一个虚拟主机忽略以“test.”和“*.test.”开头的网址,但我不知道该怎么做。

谢谢

答案1

Apache 按照记录的顺序解释其配置。例如,我们将拒绝指令放在第一位,将允许指令放在第二位。

您需要按正确的顺序排列虚拟主机配置。例如,将测试虚拟主机配置在一个名为的conf文件中001-test.myapp.local.conf常规的虚拟主机位于名为的文件中002-myapp.local.conf。或者,如果两个配置都在一个文件中,则先放置测试文件:

$ cat /etc/apache2/sites-available/myapp.local.conf 

<VirtualHost *:80>
        ServerName test.myapp.local
        ServerAlias *.test.myapp.local
        DocumentRoot /var/www/test.myapp/web
        <Directory /var/www/test.myapp/web/>
            AllowOverride All
            Require local
        </Directory>
</VirtualHost>

<VirtualHost *:80>
        ServerName myapp.local
        ServerAlias *.myapp.local
        DocumentRoot /var/www/myapp/web
        <Directory /var/www/myapp/web/>
            AllowOverride All
            Require local
        </Directory>
</VirtualHost>

因此,与第一个虚拟主机不匹配的请求将落入第二个虚拟主机。以下是在 Ubuntu 18.04 和 Apache/2.4.29 上的运行情况:

在此处输入图片描述

相关内容