售前咨询400-838-0503

网站出现403错误怎么办?

发布:2026-10-29 14:01

搜索全部帮助分类的文档

网站出现403,表示请求已经到达某个HTTP服务,但访问被拒绝。拒绝请求的可能是Nginx、网站程序,也可能是前面的CDN或WAF。

排查时应先查看对应日志,确定拒绝发生在哪一层,再修改相关配置。

本文以Linux服务器上的Nginx为例。example.com、/var/www/example 和日志路径均为示例,请替换为实际值。

1. 查看响应和对应错误日志

记录出错的完整网址、发生时间,以及是否只有某个页面或某些访客受到影响。

可以先发送普通GET请求,查看响应头:

curl -sS -D - -o /dev/null --max-time 15 \
  https://example.com/

如果返回:

HTTP/2 403

说明这次测试请求被拒绝。该命令没有携带浏览器中的登录状态,测试登录页面或接口时,需要结合实际请求判断。

接着查看Nginx错误日志:

sudo tail -n 30 /var/log/nginx/error.log

日志路径不确定时,可以通过以下命令检查配置文件及其包含的配置:

sudo nginx -T

找到对应域名的 server 配置,确认 error_log 和 access_log 路径。宝塔、自定义安装或Docker环境,应使用实际Nginx实例的配置和日志。

常见线索如下:

日志或现象 优先排查
directory index of ... is forbidden 首页文件、网站根目录、目录访问方式
(13: Permission denied) 文件权限、上级目录权限、SELinux
access forbidden by rule Nginx中的访问限制规则
应用日志明确记录权限拒绝 登录状态、账号权限、接口鉴权
CDN或WAF记录命中拦截规则 对应安全规则及匹配条件

没有找到错误日志,不能直接认定是CDN拦截。还需要检查日志路径、记录设置、时间范围,以及请求是否进入了另一个站点配置。

使用curl和Nginx错误日志排查网站403访问错误

2. 检查网站目录和首页文件

如果日志提示目录首页被禁止,先确认Nginx配置中的 root 指向实际网站目录,再检查文件:

ls -la /var/www/example/

重点检查:

  • 首页文件是否已经上传。

  • 首页名称是否与 index 配置一致。

  • 文件名大小写是否正确。

  • 网站是否实际部署在 public、dist 等子目录。

  • 请求是否命中了错误的域名或 location 配置。

例如,一个首页为 index.html 的静态站点,对应字段可以是:

root /var/www/example;
index index.html;

这里只展示相关字段,应修改现有站点中对应的位置,不要直接覆盖整份配置。

PHP站点除了正确设置首页,还需要正确配置PHP解析。仅添加 index.php 并不能代替完整的FastCGI配置。

不要为了消除403就直接开启 autoindex on;。 该设置会生成目录文件列表,可能公开原本不希望展示的文件。普通网站应修正首页或应用路由。

3. 逐级检查目录权限

出现 Permission denied 时,需要检查Nginx工作进程使用的账号:

ps -C nginx -o user,pid,args

重点查看 nginx: worker process 所在行。常见账号有 www-data、nginx 或 www,以实际输出为准。

再逐级查看文件路径权限:

namei -l /var/www/example/index.html

Nginx读取静态文件,通常需要:

  • 对路径中的每一级目录具备执行权限,也就是能够穿过该目录。

  • 对目标文件具备读取权限。

例如输出中出现:

drwx------ deploy www-data example
-rw-r----- deploy www-data index.html

假设已经确认工作进程使用 www-data 账号及相应组权限,那么文件本身允许该组读取,但 example 目录没有给该组访问权限,仍会导致读取失败。

仅针对这一已确认的示例,可以给站点目录所属组增加读取和执行权限:

sudo chmod g+rx /var/www/example

然后重新检查并访问网站。

不要对整个网站递归执行 chmod 777,也不要随意更改所有文件的属主。程序代码、配置文件和上传目录的权限需求不同,应只修正实际存在问题的位置。

如果普通权限看起来正常,还应继续检查ACL、符号链接限制和SELinux等因素。

使用namei逐级检查Nginx网站目录和首页文件权限

4. 检查访问规则、WAF和应用鉴权

如果日志提示 access forbidden by rule,检查当前站点及其包含文件中的:

allow
deny

这类规则按照顺序匹配,不能只看到某一条 allow 就认定请求一定被允许。还需要确认请求最终进入的配置块及规则继承关系。

同时检查是否存在:

  • return 403 等主动拒绝配置。

  • 管理后台的IP白名单。

  • 防盗链规则。

  • 请求方法限制。

  • 宝塔防火墙、CDN或WAF中的拦截规则。

对于安全产品,应按出错时间、访问路径、来源地址或请求编号查找对应事件。确认误拦截后,调整具体匹配条件或设置必要的例外。

网站接入CDN后,还应确认规则匹配的是代理地址,还是正确配置可信代理后还原的访客地址。

如果403由网站程序返回,应检查登录会话、账号权限、接口令牌和CSRF校验。反向代理场景下,如果访问日志已经记录 $upstream_status,其值为403可以帮助判断上游是否返回了拒绝响应。

此时修改静态文件权限通常不能解决应用层鉴权问题。

5. 启用SELinux的系统继续检查安全标签

在启用SELinux的系统上,即使普通文件权限正确,也可能因安全标签不匹配而无法读取。

先查看状态和目录标签:

getenforce
ls -Zd /var/www/example
ls -Z /var/www/example/index.html

然后复现一次错误,检查近期拒绝记录:

sudo ausearch -m AVC,USER_AVC -ts recent

Enforcing 表示SELinux正在执行策略,但仅凭这个状态不能认定它就是403的原因,应结合对应的拒绝日志判断。

如果确认该路径的持久化标签映射正确,只是文件移动或部署后标签发生变化,可以恢复目标目录的标签:

sudo restorecon -Rv /var/www/example

使用自定义网站目录时,应先配置正确的持久化文件上下文映射,再应用标签。只读网站内容和需要写入的运行目录也可能需要不同的策略。

不要把长期关闭SELinux作为常规修复方式。

6. 检查配置并复测原来的请求

如果修改了Nginx配置,先检查语法,再重载:

sudo nginx -t && sudo systemctl reload nginx

该命令适用于由systemd管理、服务名为 nginx 的实例。面板或容器环境,应使用对应实例的检查和重载方式。

如果只是修正普通文件权限,通常不需要重载Nginx。

重新测试原来的网址:

curl -sS -D - -o /dev/null --max-time 15 \
  https://example.com/

同时检查浏览器中的实际业务操作,例如登录、访问后台、加载图片或提交接口请求。

验证时应确认:

  • 原本应当允许的请求已经恢复。

  • 错误日志没有继续出现相同报错。

  • 管理后台、私有目录等原有访问限制仍然有效。

  • 如果CDN缓存了旧错误响应,已按实际缓存规则刷新对应资源。

正常结果不一定都是200。例如,未登录访问后台时跳转至登录页,也可能是符合预期的行为。

常见问题

1. 只有首页403,其他页面正常,是什么原因?

优先检查首页文件、index 设置、根目录和首页对应的路由规则。目录存在但没有可用首页时,可能出现目录首页被禁止的错误。

2. 浏览器正常,curl却返回403,是服务器故障吗?

不一定。两者的登录状态、Cookie、请求头和访问来源可能不同,安全产品也可能对自动化请求采取不同策略。应比较实际请求及对应日志。

3. 可以通过重启服务器解决吗?

权限或配置错误通常不会因重启自动消失。先定位并修正具体问题,再根据需要重载对应服务,通常更直接。

修正网站目录所属组权限后重新验证网站访问

注意事项

修改站点配置前应保留原文件,每次只调整已经确认的问题。不要通过全面放开权限、关闭安全防护或公开目录列表来掩盖403原因。

如果仍无法定位,可向莱卡云提交工单,提供出错网址、发生时间、影响范围、是否使用CDN或WAF,以及脱敏后的对应日志。请勿提交登录Cookie、访问令牌、密码或完整敏感配置。

按文档操作后还是不行,把机器编号、出问题的时间点和现象截图一起提工单,能少来回一轮。

提交工单