403 是最冤的一类报错。服务器明明活着,端口通,响应也快,就是不给你看。

于是很多人第一反应是「权限不够」,一条 chmod -R 777 下去。问题可能暂时没了,安全隐患留下了。

先分清 401 和 403

401 是「你没告诉我是谁」,403 是「我知道你是谁,但不让你进」。

看到 403,认证这一关已经过了,问题在授权或者拦截策略上。这个区分能省掉一半瞎猜。

四种拦截,四个验证动作

WAF 或安全规则。 换一个 User-Agent 再测一次。正常 UA 被拦、换成常见浏览器 UA 就能过,基本可以确定是规则匹配到了你的请求特征。

防盗链。 填一个 Referer 再测。带 Referer 正常、不带就 403,这就是防盗链,跟权限无关。

文件权限。 登录服务器看 ls -l,文件和目录的属主、权限位对不对,Nginx 或 php-fpm 的运行用户读不读得到。这条只能上机器看,测速测不出来。

IP 或地域封禁。 用不同地区的节点各测一次。只有某些地区 403,那就是地域策略或者 CDN 的地域限制。

宝塔用户最常踩的坑

面板的「防跨站攻击」会写 open_basedir,把 PHP 能访问的目录限制在站点根目录内。程序一旦要读上级目录的配置或者公共文件,直接 403。

现象很典型:首页正常,某个功能页 403,日志里没有权限错误。关掉防跨站或者把路径加进去就好了。

日志里搜这两句

access forbidden by rule 是配置里的 deny 规则命中。 directory index of ... is forbidden 是目录没有默认首页,又没开 autoindex。

两句都在 Nginx 的 error.log 里,比猜快得多。

顺序很重要

先测,确定是哪一类拦截,再改对应的那一处。权限是最后才动的,因为它影响面最大。

在 网站测速 的高级选项里换 UA、填 Referer,两次测试就能把范围缩到一种。