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】:
确实很有趣。您需要通过在 <VirtualHost>
部分中放置自定义 404
处理程序来处理它。
在<VirtualHost *:80>
下方添加这一行:
ErrorDocument 404 http://www.example.com/404.html
这将在您访问时尝试打开/home/domains/example.com/www/404.html
:
http://myusername.example.com
您的文件系统中不存在相应的文件夹。
【讨论】:
这在逻辑上看起来是正确的,但我不确定。会尝试让您知道。 嗨@anubhava,我需要一周的时间来评估。在那之后,我肯定会接受答案,如果它有效!:)
平均时间我已经投票了。 :D
没问题,如果有任何疑问或问题,请慢慢来并在此处发表评论。以上是关于VirtualDocumentRoot 处理不存在的文件夹的主要内容,如果未能解决你的问题,请参考以下文章
使用 VirtualDocumentRoot 在 SSL 中进行虚拟主机