前两天一个朋友火急火燎找我,说他网站搭好了,域名解析也弄了,但输入网址死活打不开,非得手动在域名后面敲上“/index”才能看到页面。他问我是不是服务器被人黑了,还是域名商那边出了幺蛾子。
我听完就笑了,这问题太典型了,尤其用Windows服务器IIS环境的朋友,十有八九都踩过这个坑。说白了,这不是什么玄学故障,就是服务器不知道你希望它默认展示哪个文件。
**服务器默认文档这回事**
你可以把服务器想象成一个很死板的图书馆管理员。你走进去说“我要看书”,他会问你“哪本书?”你说“随便”,他就懵了。但如果你说“我要看那本放在进门右手边第一排的书”,他就秒懂。
网站服务器也一样。当访客直接输入你的域名,比如`www.example.com`,浏览器的请求其实是个省略写法,完整意图是`www.example.com/`,也就是访问这个网站的根目录。目录是一堆文件夹,服务器得从里面挑一个文件返回给浏览器看。这个“挑谁”的名单,就叫默认文档列表。

IIS的默认文档列表里,出厂自带的是`index.htm`、`index.asp`、`default.htm`、`default.aspx`这些。但现在的建站程序,比如WordPress或者很多PHP写的管理系统,它们的入口文件都叫`index.php`。如果你的服务器没把`index.php`加进这个名单,当用户访问根目录时,服务器翻遍名单也没找到匹配项,没法自动“拿主意”,干脆撂挑子不干了,返回一个403或404错误。
这时候你在域名后手动加上`/index`,其实就是在告诉服务器:“别翻名单了,我点名要这个文件。”服务器一看,哦,指定文件存在,就正常输出了。所以问题不在域名解析,也不在网络,纯粹是服务器配置里少了“默认文档”这一项。
**为什么偏偏是index**
你去网上搜,会发现各种环境都要求入口文件叫`index.html`或`index.php`。这是历史习惯加技术规范共同作用的结果。HTTP协议刚兴起那会,服务器目录里放`index.html`是种约定俗成,后来PHP流行,`index.php`成了事实标准。大部分开源程序都遵循这个惯例,把主逻辑放在`index`文件里,通过`?参数=`来切换不同页面。
但有些朋友是从网上下载的源码,或者自己改过配置,文件名可能是`home.php`、`main.php`、`default.php`。如果你没改服务器配置,只把文件名改成了`index.php`,却发现还是不行,那就要检查是不是用了伪静态或者二级目录绑定。有些程序在子目录里还套了一层,比如`/root/`,那访问根域名自然找不到文件了。
**排查起来其实很简单**
先用最笨的办法,直接问服务器要目录文件列表。如果你用的是Linux的Apache或Nginx,在没禁止目录浏览的情况下,地址栏输入`域名/`,如果看到一堆文件名,那就说明确实没配默认页。如果你用Windows的IIS,右键点击网站,找“默认文档”选项,看看列表里有没有`index.php`。没有就添加进去,设成最顶上那一行,然后重启IIS。
如果你用的是宝塔面板,那就更容易了。进入网站设置,找到“默认文档”,把`index.php`排到第一位即可。如果是虚拟主机,后台控制面板里通常也有“默认首页设置”这个选项。
还有一个坑,就是有时候你明明加上了`index.php`,还是打不开。这时候看看网站根目录下是不是真有这个文件,有些程序把入口文件放在了`/public`或`/build`子目录里,根目录下只有`.htaccess`或`web.config`做转发。那你需要配置反向代{过}{滤}理或调整站点根目录指向,而不是傻乎乎地加默认文档。
**为什么有些人没遇到**
你可能在网上看到很多人教搭建网站,都是直接输域名就打开了。那是因为那些教程用的环境镜像,比如LNMP一键包,早就把`index.php`默认加进配置里了。或者他们用的是Nginx,Nginx的`index`指令通常默认写的是`index.html index.htm index.php`,没有的话自己改起来也容易。
用IIS的人如果用的自带默认文档,没做任何修改,恰好程序又是ASP写的`index.asp`,那也没问题。问题总是出在默认值和你所用程序不匹配的缝隙里。
**最后劝一句**
别在域名解析上死磕了,你把A记录改成什么样,这问题都解决不了。域名没问题,DNS没问题,服务器也没被入侵。去服务器管理面板里折腾一下默认首页,五分钟就能搞定。改完之后记得清一下浏览器缓存或者用无痕模式再试,因为有些浏览器会把旧的404错误页缓存一段时间,害得你白忙活。好了,按这个思路去检查吧。