如果子目录index.html不存在,则转到



我在Apache中有一个站点,该文件夹是:

/var/www/html/content

这一层有index.html

/var/www/html/content/index.html

我有很多子文件夹,但不是所有的都有index.html

所以我想如果有人去:http://example.com/subfolder/subfolder,这个子文件夹不包含index.html,重定向到:http://example.com/

我尝试在content文件夹中使用.htaccess文件,使用以下规则:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.html [L]

但是Apache告诉我这个:

内部服务器错误

您的重新连接条件说,只有重写到index.html,如果请求是一个文件或文件夹不存在,即任何人请求一个存在的文件或文件夹将阻止重写规则激活,因此很容易绕过你正在尝试做的。

不管怎样,你一开始就用错了方法,你应该做的是限制对所有目录的访问,然后只允许用户访问你想要用户访问的目录。对于不能正确配置apache限制的不兼容的开发人员来说,将索引文件放在目录中只是一个故障保护。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.html [L]

这将导致内部服务器错误(500响应),如果mod_rewrite没有在您的服务器上启用,或者/index.html不存在(这似乎不太可能给出你在问题中所说的)。

但是,这里似乎根本不需要mod_rewrite。

如果您想从请求的目录(如果存在的话)提供index.html,否则默认从文档根目录(没有外部重定向)提供/index.html,那么您可以简单地修改DirectoryIndex。例如:

DirectoryIndex index.html /index.html

DirectoryIndex指令列出了请求目录时要尝试的文件。在本例中,index.html引用当前请求目录中的一个文件。如果不存在,则在文档根目录中尝试/index.html(一个根相对URL)。

参考:

  • https://httpd.apache.org/docs/2.4/mod/mod_dir.html directoryindex

最新更新