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
。这可能吗?
我提到了以下问题,但没有用:
- VirtualDocumentRoot Domains and Subdomains
- Apache VirtualDocumentRoot redirect non-existing domains
确实是个有趣的问题。您需要通过在 <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>
我使用 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
确实是个有趣的问题。您需要通过在 <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>