Nginx网站出现403 forbidden的原因及故障模拟重现

1、原因之一是Nginx配置文件的index参数里没有指定默认首页文件名,下面是Nginx配置文件里指定默认首页的参数。

index index.html index.htm; #<==不同的首页文件用空格分隔,按顺序生效

问题模拟示例:

[root@www  ~]# cd  /application/nginx/conf/extra
[root@www extra]# cat www.conf

#www virtualhost by oldboy
server {
listen 80;
server_name www.etiantian.org;
location / {
root html/www;

        #index  index.html index.htm; #&lt;==注释首页文件参数配置
    }
    access_log off;
}

[root@www extra]# ../../sbin/nginx -s reload
[root@www extra]# tail -1 /etc/hosts
10.0.0.8 www.etiantian.org bbs.etiantian.org blog.etiantian.org etiantian.org
[root@www extra]# ll ../../html/www/

总用量 12
drwxr-xr-x 2 root root 4096 4月 15 14:20 blog
-rw-r–r– 1 root root 4 4月 17 17:11 index.html #<==存在首页文件
drwxr-xr-x 2 root root 4096 4月 15 14:19 oldboy
[root@www extra]# curl -I -s 10.0.0.8|head -1
HTTP/1.1 403 Forbidden

#<==问题是,Nginx没有指定首页文件的参数,因此访问Nginx时不会把index.html当首页,所以报403错误。
**2、原因之二是网站站点目录下没有配置文件index参数里指定的首页文件index.html或index.htm。

**问题示例:

[root@www extra]# cat www.conf

#www virtualhost by oldboy
server {
listen 80;
server_name www.etiantian.org;
location / {
root html/www;
index index.html index.htm; #<==配置首页文件配置
}
access_log off;
}
[root@www extra]# ../../sbin/nginx -s reload
[root@www extra]# rm -f ../../html/www/index.html

#<==删除站点目录下的物理首页文件
[root@www extra]# curl -I -s 10.0.0.8|head -1
HTTP/1.1 403 Forbidden

#<==问题是,Nginx有指定首页文件的参数,并且也指定了首页文件,但是首页文件并不存在,所以报403错误。

以上两个403的原因除了正确配置解决外,还可以通过一个参数来解决,就是:
autoindex on; #<==当找不到首页文件时,会展示目录结构,这个功能一般用于下载,例如:阿里云镜像站点。
示例如下:

[root@www extra]# cat www.conf

#www virtualhost by oldboy
server {
listen 80;
server_name www.etiantian.org;
location / {
root html/www;
autoindex on; #<==当找不到首页文件时,会展示目录结构,这个功能一般用于下载,例如:阿里云镜像站点。
}
access_log off;
}
当不配置index首页时,效果如下:

3、原因之三是站点目录或内部的程序文件没有Nginx的用户访问权限。

[root@www extra]# echo test > ../../html/www/index.html
[root@www extra]# chmod 700 ../../html/www/index.html

#<==设置700让nginx用户无权读取
[root@www extra]# ls -l ../../html/www/index.html
-rwx—— 1 root root 5 4月 17 17:15 ../../html/www/index.html
[root@www extra]# curl -I -s 10.0.0.8|head -1
HTTP/1.1 403 Forbidden #<==403错误
[root@www extra]# chmod 755 ../../html/www/index.html

#<==设置755让nginx用户有权读取
[root@www extra]# curl -I -s 10.0.0.8|head -1
HTTP/1.1 200 OK

#<==200 OK了
4、原因之四是Nginx配置文件中设置allow、deny等权限控制,导致客户端没有没权限访问。

[root@www extra]# cat www.conf

#www virtualhost by oldboy
server {
listen 80;
server_name www.etiantian.org;
location / {
root html/www;
index index.html index.htm;
allow 192.168.1.0/24;
deny all;
}
access_log off;
}
[root@www extra]# curl -I -s 10.0.0.8|head -1
HTTP/1.1 200 OK

#<==设置755让nginx用户有权读取
[root@www extra]# ../../sbin/nginx -s reload
[root@www extra]# curl -I -s 10.0.0.8|head -1
HTTP/1.1 403 Forbidden
提示:上述出现403错误的问题并不是Nginx才有,Apache服务的Forbidden 403问题同样也是这几个问题导致的,只是不同的软件的参数细节略有区别而已,见http://oldboy.blog.51cto.com/2561410/581383。

-------------本文结束感谢您的阅读-------------