如何通过.htaccess阻止/errors目录索引?Codeigniter问题求助
我帮你梳理下这个问题的可能原因和对应的解决办法:
1. 先确认服务器上是否真的存在errors目录
你说根目录没有errors文件夹,但返回的目录里有SingleDomainHosting.php这类主机商常见的文件,大概率是你的网站根目录(DocumentRoot)下其实存在这个errors目录——有些主机商会默认创建这类目录用于存放系统级的错误页面,可能你没注意到。
- 用FTP或SSH登录服务器,直接查看网站根目录(比如
public_html、www文件夹),确认是否有errors文件夹。 - 如果确实存在:
- 要么直接删除这个目录(如果不需要的话);
- 要么在这个目录里新建一个
index.php文件,内容可以指向你的404页面,或者直接写<?php header("Location: /"); exit; ?>跳转。
2. 检查.htaccess的完整配置
你加了Options -Indexes和IndexIgnore *,但可能缺少CodeIgniter核心的Rewrite规则,导致请求没被转发到index.php,反而被服务器直接处理目录。
正确的.htaccess应该包含这些内容:
RewriteEngine On # 排除真实存在的文件和目录,避免影响静态资源访问 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 将所有请求转发到index.php处理 RewriteRule ^(.*)$ index.php/$1 [L] # 禁止目录索引 Options -Indexes IndexIgnore *
注意:如果你的服务器是Nginx,规则会不一样,但你提到了.htaccess,应该是Apache环境。
3. 调整路由规则的顺序
你的routes.php里,通用路由$route['(:any)']写在了post/(:any)、event/(:any)这些具体路由的前面,这会导致所有请求先被(:any)捕获,后面的具体路由永远不会生效。而且如果服务器没有拦截/errors/的请求,这条通用路由也应该能捕获它,但顺序不对可能影响逻辑。
把通用路由放到最后,调整后的routes.php:
$route['default_controller'] ='webcontroller'; $route['404_override'] = 'webcontroller/errorpage'; $route['translate_uri_dashes'] = FALSE; // 具体路由放前面 $route['mycms/page/about-us'] = "mycms/webcontroller/page/about-us"; $route['page/(:any)'] = 'webcontroller/page/$1'; $route['post/(:any)'] = 'webcontroller/post/$1'; $route['event/allevents'] = 'webcontroller/event/allevents'; // 注意:这条要放event/(:any)前面,否则会被(:any)捕获 $route['event/(:any)'] = 'webcontroller/event/$1'; // 通用路由放最后 $route['(:any)'] = 'webcontroller/page/$1';
这样,当访问/errors/时,如果服务器没有这个目录,请求会被转发到index.php,然后被(:any)路由捕获,转到webcontroller/page/errors,如果这个页面不存在,就会触发你设置的404_override,返回自定义的404页面。
4. 检查服务器全局配置是否覆盖了.htaccess
如果.htaccess里的Options -Indexes没生效,可能是虚拟主机或Apache全局配置里:
- 开启了
Options +Indexes,并且设置了AllowOverride None或者AllowOverride没有包含Options,导致.htaccess的设置被忽略。 - 这种情况下,你需要联系主机商修改配置,或者如果有服务器权限的话,在虚拟主机配置里添加
Options -Indexes并设置AllowOverride All。
5. 临时应急方案
如果以上方法都没解决,可以直接在routes.php里添加专门的路由拦截errors请求:
// 拦截带斜杠和不带斜杠的情况 $route['errors'] = 'webcontroller/errorpage'; $route['errors/'] = 'webcontroller/errorpage';
这样不管服务器有没有这个目录,访问/errors或/errors/都会直接跳转到你的自定义404页面。
内容的提问来源于stack exchange,提问作者Vishal Panara

