Apache conf:如何在当使用 mod_vhost_alias 作为通配符虚拟主机时

Apache conf:如何在当使用 mod_vhost_alias 作为通配符虚拟主机时

首先,我们希望请求能够*.example.com由相应的目录处理,并且我们使用with/var/www/*/来实现这一点,如下所示:mod_vhost_aliasVirtualDocumentRoot

<VirtualHost *:80>
    ServerAlias *.example.com
    UseCanonicalName Off
    VirtualDocumentRoot /var/www/%1/
</VirtualHost>

现在我们想通过将相同的 RewriteRules 应用于所有子域/目录(在 vhost 配置的<Directory>块内)来扩展这个共享配置 - 但我们不知道如何引用子域/目录。

我们基本上尝试做这样的事情(请注意 %1 的使用,在这种情况下它不起作用):

<VirtualHost *:80>
    ServerAlias *.example.com
    UseCanonicalName Off
    VirtualDocumentRoot /var/www/%1/

    <Directory /var/www/%1>
            RewriteEngine on
            RewriteRule     ^about/?$       index.php?view=about
            RewriteRule     ^settings/?$    index.php?view=settings
            RewriteRule     ^support/?$     index.php?view=support
    </Directory>
</VirtualHost>

这样的事可能吗?

谢谢。

答案1

好的,我们设法让它工作了。只需要对路径进行一些小的调整<Directory>(即使用 * 通配符代替 %1)、删除 RewriteRules 模式中的 ^ 字符,并在替换字符串中添加前导 /:

<VirtualHost *:80>
    ServerAlias *.example.com
    UseCanonicalName Off
    VirtualDocumentRoot /var/www/%1/

    <Directory /var/www/*>
        RewriteEngine on
        RewriteRule     about/?$       /index.php?view=about
        RewriteRule     settings/?$    /index.php?view=settings
        RewriteRule     support/?$     /index.php?view=support
    </Directory>
</VirtualHost>

现在,为了遵守 ServerFault 的政策(以及 Google 的索引),我将这个问题标记为已回答,但我必须强调,如果没有拇指#httpdirc.freenode.net

答案2

<Directory>在这种情况下,不要担心。

<VirtualHost *:80>
    ServerAlias *.example.com
    UseCanonicalName Off
    VirtualDocumentRoot /var/www/%1/

    RewriteEngine on
    RewriteRule     ^/about/?$       /index.php?view=about
    RewriteRule     ^/settings/?$    /index.php?view=settings
    RewriteRule     ^/support/?$     /index.php?view=support
</VirtualHost>

如果您还有其他事情Rewrite需要完成,例如访问控制,请添加一个<Location>块而不是一个<Directory>块:

<Location />
    Order deny,allow
    Deny from all
    Allow from 10.0.0.0/8
</Location>

相关内容