![使用捕获所有 *(通配符)别名时从 Apache2 serverAlias 中排除特定域](https://linux22.com/image/795586/%E4%BD%BF%E7%94%A8%E6%8D%95%E8%8E%B7%E6%89%80%E6%9C%89%20*%EF%BC%88%E9%80%9A%E9%85%8D%E7%AC%A6%EF%BC%89%E5%88%AB%E5%90%8D%E6%97%B6%E4%BB%8E%20Apache2%20serverAlias%20%E4%B8%AD%E6%8E%92%E9%99%A4%E7%89%B9%E5%AE%9A%E5%9F%9F.png)
我有一个需要支持自定义域的 Web 应用程序,在这方面我设置了以下基于名称的虚拟服务器:
<VirtualHost *:80>
ServerName example.com
ServerAlias * *.example.com www.example.com example.com
RailsEnv production
RackEnv production
DocumentRoot /srv/www/example/current/public
<Directory /srv/www/example/current/public>
AllowOverride all
Options -MultiViews FollowSymLinks
</Directory>
ErrorLog /srv/www/example/log/error.log
TransferLog /srv/www/example/log/access.log
</VirtualHost>
注意到 * 作为服务器别名了吗?它捕获了该服务器上的所有域。但是,我在此服务器上还有其他站点,我想将其从此列表中排除。对我来说,拥有一个排除域列表比手动将用户在此服务上可能注册的每个域设置为 serverAlias 更经济...
也许这不是最好的方法,但我正在寻求帮助,以最好的(相对简单的)方式设置一个可以捕获任何域的 Web 应用程序,同时允许其他具体的域被路由到不同的应用程序。
答案1
Apache 按照域定义的顺序搜索匹配项。
如果我正确理解了您的问题,那么可以通过定义在捕获所有主机之前要排除的主机来解决它。
例子:
<VirtualHost *:80>
ServerName excluded.example.com
ServerAlias something.example.com ...
...
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
ServerAlias * *.example.com www.example.com example.com
RailsEnv production
...
</VirtualHost>