VirtualDocumentRoot 处理不存在的文件夹

Posted

技术标签:

【中文标题】VirtualDocumentRoot 处理不存在的文件夹【英文标题】:VirtualDocumentRoot handling non-existent folders 【发布时间】:2015-04-22 00:46:06 【问题描述】:

使用 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。这可能吗?

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

VirtualDocumentRoot Domains and Subdomains Apache VirtualDocumentRoot redirect non-existing domains

【问题讨论】:

这似乎是一个有趣的新问题+1 【参考方案1】:

如果您有映射到文件夹的虚拟子域,那么您不能只检查文档根目录的存在吗?如果不存在重定向到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>

或者,如果由于动态分配,%DOCUMENT_ROOT 变量没有拾取完整的虚拟文档根路径,则可以通过将子域分配给 env 变量来尝试这种方式,然后使用它来检查路径。

  <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>

【讨论】:

哇...这看起来很有希望。让我试试这个! :) 嗨@PanamaJack,我需要一周的时间来评估。在那之后,我肯定会接受答案,如果它有效! :) 平均时间我已经投票了。 :D【参考方案2】:

确实很有趣。您需要通过在 &lt;VirtualHost&gt; 部分中放置自定义 404 处理程序来处理它。

&lt;VirtualHost *:80&gt;下方添加这一行:

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

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

http://myusername.example.com

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

【讨论】:

这在逻辑上看起来是正确的,但我不确定。会尝试让您知道。 嗨@anubhava,我需要一周的时间来评估。在那之后,我肯定会接受答案,如果它有效! :) 平均时间我已经投票了。 :D 没问题,如果有任何疑问或问题,请慢慢来并在此处发表评论。

以上是关于VirtualDocumentRoot 处理不存在的文件夹的主要内容,如果未能解决你的问题,请参考以下文章

VirtualDocumentRoot 域和子域

使用 VirtualDocumentRoot 在 SSL 中进行虚拟主机

Apache 2.2 忽略 VirtualDocumentRoot 虚拟主机?

设置Laravel项目以使用多个域名

Xampp 虚拟主机

批处理判断文件存在