我昨天折腾了一个晚上,差点把键盘拍烂。事情是这样的,我把做好的网站文件传到了服务器,自认为一切妥当,结果在浏览器里一输入网址,弹出的不是我的站点,而是一个白底黑字的登录框。上面写的什么?WebDAV 身份验证,或者干脆就是“401 Authorization Required”。我当时就愣了,这网站怎么还要过一道门禁?
说实话,这种问题挺常见的,尤其是你自己买了个虚拟主机,或者用了一些带管理面板的云服务器。别看它弹出来一个像模像样的登录框,至少八成的情况根本不是你的网站程序需要登录,而是服务器压根没打算让你访问。
我第一个想到的就是权限问题。这个可能性最大,也最容易被忽略。你想想,你用 FTP 或者网页端的文件管理器把文件传上去,那些文件可能默认带着一个权限值。如果目录权限是 755,文件是 644,那一般没什么事。但如果你传上去的文件是 600 甚至更低,那在服务器看来,这个文件就是你一个人私有的,别人访问,对不起,拒绝。而且有些比较“较真”的服务器,它对根目录的权限要求还挺苛刻,要是你的根目录被设成了 700,那连 PHP 解析都可能瘫痪,更别说访问了。
我那次就是吃了这个亏。我之前用的那台服务器有点毛病,文件管理器重置了所有目录的权限,全变成了 700,我当时没细看,直接把压缩包解压进去了,一访问,哦豁,直接让我登录。那个登录框看着还挺正式的,就跟要进什么后台管理系统似的,其实根本没有这回事。解决办法倒也简单,把网站根目录改成 755,普通文件改成 644,刷新一下就破开了。
还有一种可能性,是你装了那种带“伪静态”规则的网站程序,比如 ThinkPHP 或者 Laravel 框架。这类程序要求入口文件比较靠前,而且它会有个运行保护机制。如果你的服务器环境没配置好,比如 rewrite 规则没设置对,它就可能把正常的外网请求误判成一个需要内部验证的请求。具体表现就是,明明你没设密码,它偏要你登录。这种时候,得检查一下.htaccess 文件或者 Nginx 的 conf 配置,看看有没有奇怪的“AuthType Basic”这种字眼。我之前见过一个朋友,他自己加了一段代码想让后台更安全,结果加错了位置,搞成了整站都要登录,真是哭笑不得。

再有一个原因,就是纯粹的资源占用卡顿导致的假象。不知道你有没有遇到过,服务器负载一高,或者内存不够用,Apache 或者 Nginx 会出现短暂的工作进程混乱。这时候你访问网站,有时候它会弹出个认证框,你输入什么密码都没用,因为它根本不是要那个,就是程序响不过来了。等个几分钟,冷静一下,再访问就好了。这种事听着有点像玄学,但我真的遇到过,重启一下进程或者等高峰期过去,问题自己就消失了。
另外,得提醒一嘴,如果你用的是那种带“网站保护”的面板,比如宝塔或者 BT 面板,你可以在后台设置给某个目录加访问密码,这种叫“目录保护”。有时候你操作失误,可能不小心把整站根目录给保护了,那访问的时候自然就提示让你登录。这种倒好办,去面板里找找那个“网站”或者“目录”的密码设置,关掉就行。
我当时查出真相之后,真是有点无奈,不是什么高深问题,是我在删除旧文件的时候,不小心把目录属性调成了只读加私人,等于我自己给网站上了一把锁,还让浏览器替我背了锅。回过头想想,凡是遇到这种浏览器弹出来的登录框,千万别先想着去输密码,多半不是你的账号密码问题。先去看服务器的日志报错,或者直接看看文件权限,大概率能省下半小时的时间。
反正,网站能传上去,多半代码是没问题的,问题就出在服务器觉得“你没资格看”。下次再遇到这个,先深呼吸,去把权限捋一遍。这事儿说实话挺磨人的,但弄明白之后,就感觉也就那样。