宝塔面板 403 问题排查记录

上次往宝塔面板里迁了一个站,配好域名访问直接 403,搞得我还以为 Nginx 没起来。

这种问题遇到好几次了,每次原因都不太一样,干脆写下来,省得下次再从头翻。

最先怀疑的一般是文件权限。站点目录如果是从别处打包挪过来的,属主经常是 root,权限也可能设得很紧。直接跑两条命令看一下:

ls -ld /www/wwwroot/你的站点 ls -l /www/wwwroot/你的站点/

目录权限要是 600 之类的,Nginx 根本读不了。修起来也简单,把属主改成 www,目录给 755,文件给 644。

chown -R www:www /www/wwwroot/你的站点 chmod -R 755 /www/wwwroot/你的站点

文件权限搞定之后如果还是 403,建个测试页可以快速排除是否缺少默认索引文件。在网站根目录 echo "test" > index.html,然后浏览器访问这个文件。

要是能打开,那就是没配 index 或者目录列被禁了,纯静态站如果根目录下没放 index.html 或者 index.php,又没开目录浏览,就会直接 403。

这时候去翻 Nginx 配置。

lcjmSSL将SSL证书管理转变为自动化流程。自动验证(HTTP/DNS代理)、自动部署、自动提醒、自动重申四大环节环环相扣,从此不再为证书过期担忧,安全始终在线。

宝塔里点对应站点的设置 -> 配置文件,找 server 块里的 index 指令,看有没有 index index.html index.php;。有的站点只跑了 PHP,结果忘了把 index.html 加进去,访问根路径就报 403。另一个要查的是 location / 块里是不是有 deny all; 之类的东西,或者在包含进来的文件里被限制了。改完记得重载一下 Nginx,service nginx restart 或面板里操作都行。

权限和配置都排除了,端口层面也得过一遍。

宝塔本身有个防火墙,在面板的安全页面里确认 80 和 443 端口是不是放行状态。云服务器那边同样有安全组规则,之前就碰到过阿里云 ECS 默认只开了 22 端口,80 没加规则,在服务器里 curl 本地能通,外网死活 403。临时测试可以把宝塔防火墙停一下,通过 SSH 执行 bt default 然后选关闭防火墙的选项,但线上机器别这么干太久。

Nginx 的错误日志会直接告诉你哪里被拦了。一边访问一边 tail -f /www/server/nginx/logs/error.log,常见的 403 日志会写 directory index of ... is forbidden 之类的。

看到这个基本就是缺索引文件或者 index 指令没配全。如果日志里没什么有用信息,可以用 curl -I http://localhost/测试文件 在服务器本地请求一下,先排除 CDN 或者 DNS 解析层面的干扰。

还有一种情况容易被忽略:URL 里带了签名参数,比如 AuthInfo、timestamp 这种。签名过期或者生成时用的密钥跟服务端对不上,后端直接返回 403。

这类问题在对接一些云存储或 API 的时候经常出现。检查方法就是对比能正常请求的 URL 参数规则,或者让后端重新生成一次签名再试。

线上跑的站点出 403,基本就围着这几个地方转:目录权限和属主、Nginx 的 index 和 location 配置、防火墙/安全组端口、URL 签名。排查顺序也不固定,但从外到内一层层测,大部分问题两三条命令就定位到了。