VirtualDocumentRoot 处理不存在的文件夹

VirtualDocumentRoot handling non-existent folders

我使用 Apache 设置了 VirtualDocumentRoot,它的工作方式如下:

<VirtualHost *:80>
    UseCanonicalName Off
    ServerName app.example.com
    ServerAlias *.example.com
    VirtualDocumentRoot "/home/domains/example.com/%1"
    <Directory "/home/domains/example.com/*">
        Options Indexes FollowSymLinks
        AllowOverride All
        Order Allow,Deny
        Allow from all
    </Directory>
</VirtualHost>

如果我把http://mail.example.com的URL,DocRoot变成/home/domains/example.com/mail,如果是http://www.example.com,DocRoot变成/home/domains/example.com/www,等等上。

现在我想检查文件夹是否存在,例如当用户请求 http://myusername.example.com 之类的域时,DocRoot 检查 /home/domains/example.com/myusername 但它不存在,所以它应该参考/home/domains/example.com/404。这可能吗?

我提到了以下问题,但没有用:

确实是个有趣的问题。您需要通过在 <VirtualHost> 部分放置自定义 404 处理程序来处理它。

<VirtualHost *:80> 下方添加此行:

ErrorDocument 404 http://www.example.com/404.html

这将在您访问时尝试打开 /home/domains/example.com/www/404.html:

http://myusername.example.com

并且您的文件系统中不存在相应的文件夹。

如果您有映射到文件夹的虚拟子域,那么您不能只检查文档根目录是否存在吗?如果不存在,则重定向到 404 subdomain,后者又应该像这样使用 /home/domains/example.com/404

<VirtualHost *:80>
    UseCanonicalName Off
    ServerName app.example.com
    ServerAlias *.example.com
    VirtualDocumentRoot "/home/domains/example.com/%1"
    <Directory "/home/domains/example.com/*">
        Options Indexes FollowSymLinks
        AllowOverride All
        Order Allow,Deny
        Allow from all
        RewriteEngine On
        RewriteCond %{DOCUMENT_ROOT} !-d
        RewriteRule ^(.*) http://404.example.com/ [R=301,L]
    </Directory>
</VirtualHost>

或者如果完整的 virtualdocumentroot 路径由于动态分配而没有被 %{DOCUMENT_ROOT} 变量获取,可以通过将子域分配给环境变量来尝试这种方式,然后使用它来检查路径。

  <VirtualHost *:80>
        UseCanonicalName Off
        ServerName app.example.com
        ServerAlias *.example.com
        VirtualDocumentRoot "/home/domains/example.com/%1"
        <Directory "/home/domains/example.com/*">
            Options Indexes FollowSymLinks
            AllowOverride All
            Order Allow,Deny
            Allow from all
            RewriteEngine On
            RewriteCond %{HTTP_HOST} ^(.+)\.example\.com [NC]
            RewriteRule ^(.*)$ - [E=virt_path:%1,N,NS]

            RewriteCond %{DOCUMENT_ROOT}/%{ENV:virt_path} !-d
            RewriteRule ^(.*) http://404.example.com/ [R=301,L]
        </Directory>
    </VirtualHost>