Apache VirtualHosts:可能有两种子域配置



目前,我在Apache 2.4服务器上设置了以下VirtualHost配置(运行EasyHP):

## Local domain access
<VirtualHost 127.0.0.1>
    UseCanonicalName Off
    ServerAlias *.local *.*.local
    VirtualDocumentRoot "D:/var/www/%-2/public_html"
    <Directory "D:/var/www/*/public_html">
        Require all granted
        Options Includes Indexes FollowSymLinks
        AllowOverride All
    </Directory>
</VirtualHost>

从本质上讲,这将{domain}.local{sub}.{domain}.local映射到{domain}的文档根-之所以这样做,是因为我主要使用Laravel进行开发,并充分利用了子域路由。

然而,在某些情况下,我需要让子域请求指向域的文档根父目录中的另一个目录,从而用自己的文档根调用不同的应用程序。

使用上述VirtualHost配置,请求test.example.local将在D:varwwwexamplepublic_html上提供文档根目录。

我可以对此配置进行哪些添加或更改,以允许上面的示例为D:varwwwexampletestpublic_html提供服务,但前提是test目录存在?

早上好Mike,

我建议创建单独的虚拟主机

## Local domain access
<VirtualHost 127.0.0.1>
    UseCanonicalName Off
    ServerAlias *.*.local
    VirtualDocumentRoot "D:varwwwexampletestpublic_html"
    <Directory "D:varwwwexampletestpublic_html">
        Require all granted
        Options Includes Indexes FollowSymLinks
        AllowOverride All
    </Directory>
</VirtualHost>
## Local domain access
<VirtualHost 127.0.0.1>
    UseCanonicalName Off
    ServerAlias *.local
    VirtualDocumentRoot "D:varwwwexamplepublic_html"
    <Directory "D:varwwwexamplepublic_html">
        Require all granted
        Options Includes Indexes FollowSymLinks
        AllowOverride All
    </Directory>
</VirtualHost>

这会将所有子域请求路由到"D:\var\www\example\test\public_html",并将所有其他子域请求路由至"D:\var \www\example\public_html"

文档可在此处找到:https://httpd.apache.org/docs/current/vhosts/examples.html

是的,所以我认为我不应该让事情变得复杂(大象/蚊子的比喻),但仍然应该遵守DRY原则,这样我的虚拟主机配置文件中就不会出现大量异常——最终,这会让我很累,也很难维护。

因此,我选择使用Apache的mod_macro模块——这需要显式启用。

结果是:

# Macro LocalSub
# For specific *.*.local subdomains that require their own DIRECTORY_ROOT
<Macro LocalSub $sub $domain>
    <VirtualHost 127.0.0.1>
        ServerName $sub.$domain.local
        DocumentRoot "D:/var/www/$domain/$sub/public_html"
        <Directory "D:/var/www/$domain/$sub/public_html">
            Require all granted
            Options Includes Indexes FollowSymLinks
            AllowOverride All
        </Directory>
    </VirtualHost>
</Macro>
# Specific subdomain Macro usage
Use LocalSub assets example
Use LocalSub images01 mydomain
Use LocalSub images02 mydomain
# Fallback to *.local and *.*.local (points to the same DOCUMENT_ROOT)
<VirtualHost 127.0.0.1>
    UseCanonicalName Off
    ServerAlias *.local *.*.local
    VirtualDocumentRoot "D:/var/www/%-2/public_html"
    <Directory "D:/var/www/*/public_html">
        Require all granted
        Options Includes Indexes FollowSymLinks
        AllowOverride All
    </Directory>
</VirtualHost>

这比VirtualHost上下文中的mod_rewrite方法要好,因为该方法允许正确设置DOCUMENT_ROOT

最后,试图让Apache为我自动化一切,从而屈从于我非常具体的意愿,这不是一条路——所以一点手动覆盖就可以了,同时保持一切干燥。

这可以通过对<Directory>:进行"宏观化"来更进一步

# Macro Directory
# Default Directory configuration on a per-vhost basis
<Macro Directory $dir>
    <Directory "D:/var/www/$dir/public_html">
        Require all granted
        Options Includes Indexes FollowSymLinks
        AllowOverride All
    </Directory>
</Macro>
# Macro LocalSub
# For specific *.*.local subdomains that require their own DIRECTORY_ROOT
<Macro LocalSub $sub $domain>
    <VirtualHost 127.0.0.1>
        ServerName $sub.$domain.local
        DocumentRoot "D:/var/www/$domain/$sub/public_html"
        Use Directory $domain/$sub
    </VirtualHost>
</Macro>
# Specific subdomain Macro usage
Use LocalSub assets example
Use LocalSub images01 mydomain
Use LocalSub images02 mydomain
# Fallback to *.local and *.*.local (points to the same DOCUMENT_ROOT)
<VirtualHost 127.0.0.1>
    UseCanonicalName Off
    ServerAlias *.local *.*.local
    VirtualDocumentRoot "D:/var/www/%-2/public_html"
    Use Directory *
</VirtualHost>

最新更新