Apache:使用正则表达式在多个虚拟主机上提供同一文件

Apache:使用正则表达式在多个虚拟主机上提供同一文件

我在 Apache 2.2 服务器上设置了各种虚拟主机 (vhosts),例如:

examplea.domain
exampleb.domain
testsitea.domain
testsiteb.domain
testsite.domain
othersitea.domain

在与正则表达式“site[az].domain”匹配的虚拟主机上,我希望能够从 /usr/local/apache/files/logo.gif 提供相同的文件(例如 logo.gif)。

如果我想在每个网站上都这样做,我显然必须有类似的东西:

<VirtualHost *:80>
ServerName testsitea.domain
...
Alias /logo.gif /usr/local/apache/files/logo.gif
...
</VirtualHost>

<VirtualHost *:80>
ServerName testsiteb.domain
...
Alias /logo.gif /usr/local/apache/files/logo.gif
...
</VirtualHost>

等等等等

但是,由于各种原因,我无法确保 VirtualHost 会设置别名,因此我需要将其设为全局 Apache 设置,但在 ServerName 上使用正则表达式匹配。

如果可能的话,有人能给我指出正确的方向吗?

答案1

我有一个建议,我不知道它是否适合您的环境,但它可以给你一些想法。我不知道如何使用 Alias 来实现这一点,但也许您可以使用 mod_rewrite 来做同样的事情。首先创建一个像 common.domain 这样的网站,这个虚拟主机将用于存储其他网站使用的所有文件。

创建全局重写规则以执行重定向,stackoverflow 上的线程。您可以在目录部分定义此重写规则,例如,如果您的所有 vhost 都存储在目录 /var/www/vhosts 下,如下所示:* /var/www/vhosts/siteA.domain/

  • /var/www/vhosts/siteB.domain/

  • /var/www/vhosts/siteC.domain/

  • /var/www/vhosts/siteD.domain/

您可以像这样定义重写规则:

<Directory /var/www/vhosts>
                Options FollowSymLinks
                AllowOverride None
                RewriteEngine On
                RewriteCond "%{HTTP_HOST}" "site[a-z]*\.example\.com" [NC,OR]
                RewriteCond "%{SERVER_NAME}" "site[a-z]*\.example\.com" [NC]
                RewriteRule "/logo.gif"  "http://common.example.com/logo.gif" [L]

# 例如:
# RewriteRule "/logo.gif" "http://alvita.alpic.centerblog.net/6ba61946.gif“[L]

</Directory>

因此,您拥有虚拟主机匹配,并且可以做任何您想做的事情,并且您可以将此解决方案应用于许多 Web 服务器。

我认为这是最好的解决方案,或者您可以在父目录之外的 httpd.conf 中定义全局重写规则。此解决方案的问题在于您需要在每个虚拟主机中添加以下内容:

RewriteOptions 继承

因为默认情况下重写规则不适用于 VirtualHost。有关更多信息,请参阅stakoverflow 线程

祝你今天过得愉快。

相关内容