我们有一个 vhost conf 文件,它是多租户场景中的所有内容,但我们的一位客户需要有一个特定的alias
声明,目前定义如下......
Alias /special "/srv/application/public/example/special"
目前,这意味着系统中的每个客户端/域都将被捕获并强制提供服务,/special/
这显然是一个问题。
我如何限制此声明的范围Alias
,以便仅当请求的域匹配example.com
或时才应用它www.example.com
?
仅供参考,我们很快就会从 Apache 2.2 升级到 2.4,如果在特定情况下有任何差异,请指出。谢谢!
编辑我应该指出,在这种情况下我们受到中间件的限制,并且必须将所有内容保存在单个 vhost 声明中。
答案1
最直接的方法是为该域创建一个单独的非默认虚拟主机声明:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Alias /special "/srv/application/public/example/special"
# other default directives
</VirtualHost>
<VirtualHost *:80>
# other default directives
</VirtualHost>
唯一的缺点是您需要# other default directives
在 example.com 和默认虚拟主机中维护相同的内容。一个好方法是将它们全部放入一个文件中,并将Include
该文件放入两个虚拟主机声明中。
或者,您可以只保留一个虚拟主机声明并添加一个 RewriteRule:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$
RewriteRule ^/special(/.*|$) /srv/application/public/example/special$1
当您将来添加更多例外情况时,请务必考虑哪种方法更具可持续性,因为您肯定会这样做。
答案2
您应该将别名指令放在 example.com 的 VirtualHost 定义中
<VirtualHost *:80>
ServerName example.com
...
Alias /special /srv/application/pulic/example/special
...
</VirtualHost>
答案3
大型 vhost 文件使管理变得非常困难,为每个租户创建一个单独的文件并将其包含在 vhost 文件中。这可以实时完成,并在完成后让 apache 重新加载配置。这样,您可以支持每个租户的多个域,并且可以更轻松地进行更改,如 Andrew 上面建议的那样。