把网页传到服务器,绑好域名,浏览器一打开却在下载一个文件;或者访问某个子目录,屏幕上直接列出一排文件名。这两种情况,多半和 index.php 有关。
它是服务器找的默认首页
Apache 和 nginx 都有默认文档的设置,常见顺序是 index.php、index.html。请求落到一个目录上,服务器按这个顺序找文件,找到哪个就把哪个当首页返回。index.php 排在前面,是因为动态站点要靠它接收请求,再分发到具体页面。
ThinkPHP、Laravel、WordPress 这类程序,入口都是根目录那个 index.php。里面通常只做三件事:加载框架引导文件、读取配置、把请求交给路由。所以它不能删,删了整站要么 500,要么直接 404。
留着它有哪些风险
- 安装包自带的 index.php 有时会输出框架版本,被人看到就知道该试哪些已知问题
- 备份文件 index.php.bak、index.php~ 留在目录里,源码等于公开
- 老站点上传的探针、临时脚本没清理,成了别人进门的把手
- 目录列表没关,访问子目录能看到全部文件,连数据库备份都在里面
怎么确认目录有没有暴露
在自己站点上访问一个没有首页文件的子目录,比如放图片的目录。正常应该返回 403,或者跳回首页;如果出现一排文件名和修改时间,就是目录列表开着。nginx 里把 autoindex 设成 off,Apache 里去掉 Indexes 选项,改完重载配置再看一次。
顺手查几处:访问 robots.txt 看有没有把敏感路径写进去;确认站点根目录下只有该有的文件;把 .sql、.zip、.bak 这类后缀在配置里直接拒绝访问。这些都是站长得自己做的事,等出事再补就晚了。
入口文件的位置也收拾一下。框架默认入口在根目录,URL 里带着 index.php,看着不专业,也容易被批量扫描。打开伪静态把入口隐藏掉,同时确认根目录只有一份入口文件,测试用的副本删干净。
还有一种情况:改完配置访问首页报 500,日志里写着找不到入口文件。先确认根目录里 index.php 还在,再确认默认文档的顺序里有没有把它漏掉,最后才去看权限。
判断很简单:index.php 要留,但要确认它是最新版本、旁边没有备份文件、目录列表是关的。三件事花十分钟,比事后恢复数据便宜得多。