我的目标是能够创建 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 上的运行情况: