返回 403 状态码的场景:

  1. 网站禁止特定的用户访问所有内容,例:网站屏蔽某个ip访问。
  2. 访问禁止目录浏览的目录,例:设置 autoindex off 后访问目录。
  3. 用户访问只能被内网访问的文件。

常见的错误情况

1.权限配置不正确

这个是 nginx 出现 403 forbidden 最常见的原因。

为了保证文件能正确执行,nginx既需要文件的读权限,又需要文件所有父目录的可执行权限

例如,当访问 /usr/local/nginx/html/image.jpg 时,nginx 既需要 image.jpg 文件的可读权限,也需要 /, /usr,/usr/local,/usr/local/nginx,/usr/local/nginx/html 的可以执行权限。

解决办法:设置所有父目录为 755 权限,设置文件为 644 权限可以避免权限不正确。

tip:我的情况属于需要文件所有父目录的可执行权限,我在 home 目录建立软链指向 nginx 的默认的根目录/usr/local/nginx/html,没有考虑到,通过 http 访问用户只对 nginx 的根目录有访问权限,home 目录及其他目录不在可访问路径下,所以没有权限访问。解决方案:nginx.conf 中 server 下的 root 配置项直接配置 nginx 的根目录下的路径,或者修改 nginx 默认根目录,改成 home 目录,如 /home/www,然后再把项目代码迁移到这个目录下面。


2019-09-26 新增

nginx 配置是一个 server 块对应一个虚拟主机,所以 nginx 默认根目录对应到每一个 server 中都是不同的(nginx 1.14 找半天,未发现引入其他根目录变量或者参数)。访问权限操作主要有两点:第一点,是目录的用户和用户组要与 nginx 配置文件中的 user 一致。我把 nginx、php-fpm 都改成了 www(当然前提是,你系统中要存在名为 www 的用户和用户组)。第二点,是访问权限,目录该有的 755 不少就行。

关于这第一点(第二点可以忽略)我在尝试更换虚拟主机更目录时,发现了一些问题。php-fpm 修改配置文件(我的是 /usr/local/php/etc/php-fpm.d/www.conf),然后 重启 php-fpm 即可。nginx 直接在 nginx 安装目录下的 conf 文件夹下找到 nginx.conf 文件,修改里面的 user 变量即可。最诡异的虚拟主机的用户和用户组修改。

root 和 index 可以直接在 server 块中添加,也可以选择在 server 下的 location / 中添加,效果大致相同。

root /wwwroot/html
index index.html index.htm index.php

主要问题是出在你新建的虚拟主机目录放的位置。默认的 /usr/local/nginx/html 当然可以。当我在 /root ,就是管理员根目录下添加一文件夹时,直接就报 403 Forbidden 错误。而在 / 服务器根目录下新建文件夹存放虚拟主机也没有问题,甚至都不用修改相关文件夹的所属用户和用户组。回到纠结的 /root 目录,尝试修改 /root 的用户和用户组为 www,直接就好了。

总结一点,一般情况下,直接在服务器根目录新建文件夹作为虚拟主机目录,就可以直接使用了,如果非要在一些比较特殊的目录下创建属于虚拟主机的目录,则需要更改所在更目录的用户和用户组为 http 可访问的用户,如我这里的 www

附主机信息:centos, nginx 1.14, php 7.3.3。


2.目录索引设置错误(index 指令配置)

网站根目录不包含 index 指令设置的文件。

例如,运行 PHP 的网站,通常像这样配置 index

index  index.html index.htm index.php;

当访问该网站的时,nginx 会按照 index.html,index.htm ,index.php 的先后顺序在根目录中查找文件。如果这三个文件都不存在,那么 nginx 就会返回 403 Forbidden

如果 index 中不定义 index.php ,nginx 直接返回 403 Forbidden 而不会去检查 index.php 是否存在。

同样对于如果运行 jsp, py 时也需要添加 index.jsp,index.py 到目录索引指令 index 中。

解决办法:添加首页文件到 index 指令,常见的是 index.php,index.jsp,index.jsp 或者自定义首页文件。