目前,我在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>