使用Apache,我已经build立了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
://www.example.com,DocRoot变成/home/domains/example.com/www
,等等。
现在我想检查文件夹是否存在,比如当用户请求域名如http://myusername.example.com
,DocRoot检查/home/domains/example.com/myusername
并且不存在,所以应该参考/home/domains/example.com/404
。 这可能吗?
我提到了下面的问题,但没有成功:
如果你有映射到文件夹的虚拟子域名,那么你不能检查文件根目录的存在吗? 如果不存在,则重定向到404 subdomain
,而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}
变量拾取,那么可以通过将子域指定为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>
确实有趣的问题。 您需要通过在<VirtualHost>
部分放置自定义404
处理程序来处理它。
在<VirtualHost *:80>
下面添加这行:
ErrorDocument 404 http://www.example.com/404.html
这将尝试打开/home/domains/example.com/www/404.html
当您访问:
http://myusername.example.com
并且相应的文件夹不存在于您的文件系统中。