使用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
的网址,则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
。这可能吗?
我提到了以下问题,但没有好处:
答案 0 :(得分:2)
如果您有映射到文件夹的虚拟子域,那么您是否只是检查文档根目录的存在?如果不存在,则重定向到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}
或者,如果由于动态分配而没有 <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>
变量拾取完整的virtualdocumentroot路径,可以通过将子域分配给env变量然后使用它来检查路径来尝试这种方式。
{{1}}
答案 1 :(得分:1)
404
部分中放置自定义<VirtualHost>
处理程序来处理它。
在<VirtualHost *:80>
下方添加此行:
ErrorDocument 404 http://www.example.com/404.html
当您访问时,这将尝试打开/home/domains/example.com/www/404.html
:
http://myusername.example.com
文件系统中不存在相应的文件夹。