Nginx 403错误:[文件夹]的目录索引被禁止


183

我有3个域名,并且正在尝试使用Nginx将所有3个站点托管在一台服务器(Digital Ocean Droplet)上。

mysite1.name mysite2.name mysite3.name

其中只有1个有效。其他两个导致403错误(以相同的方式)。

在我的nginx错误日志中,我看到:[error] 13108#0: *1 directory index of "/usr/share/nginx/mysite2.name/live/" is forbidden

我启用了网站的配置是:

server {
        server_name www.mysite2.name;
        return 301 $scheme://mysite2.name$request_uri;
}
server {
        server_name     mysite2.name;

        root /usr/share/nginx/mysite2.name/live/;
        index index.html index.htm index.php;

        location / {
                try_files $uri $uri/ /index.html index.php;
        }

        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}

所有3个站点都有几乎相同的配置文件。

每个站点的文件都位于/usr/share/nginx/mysite1.name/someFolder等文件夹中,然后/usr/share/nginx/mysite1.name/live是指向该文件的符号链接。(与mysite2和mysite3相同。)

我查看了所有文件均禁止使用的Nginx 403,但这无济于事。

有什么想法可能有问题吗?


24
我认为您index.html index.php缺少文件,您确定文件在该文件夹中吗?
Mohammad AbuShady 2013年

哦,你是对的。这两个无法正常工作的站点是Laravel项目(在/ public子文件夹中具有index.php)和旧的CodeIgniter项目(在/ public_web子文件夹中具有index.php)。但是我不确定如何更改配置以使站点正常工作。
瑞安

就像@MohammadAbuShady所说的那样,我的文件夹中没有索引文件,并且出现了此错误。
ajon

我只是再次遇到此错误,但这次的问题是我不小心将设置root/Users/myUsername/code/app而不是/Users/myUsername/code/app/public
瑞安

这是服务器管理员大放异彩的时候。详细信息
OldFart

Answers:


169

如果您关闭了目录索引,并且遇到了此问题,则可能是因为您使用的try_files具有目录选项:

location / {
  try_files $uri $uri/ /index.html index.php;
}                 ^ that is the issue

删除它,它应该可以工作:

location / {
  try_files $uri /index.html index.php;
} 

为什么会这样

TL; DR:这是由于nginx会尝试索引目录并被其自身阻止而引起的。引发OP提到的错误。

try_files $uri $uri/表示从根目录尝试由指向的文件uri,如果该文件不存在,则尝试使用目录(因此为/)。当nginx访问目录时,它将尝试建立索引并将其中的文件列表返回到浏览器/客户端,但是默认情况下,目录索引处于禁用状态,因此它返回错误“ Nginx 403错误:[文件夹]的目录索引”是禁止的”。

目录索引由以下autoindex选项控制:https : //nginx.org/en/docs/http/ngx_http_autoindex_module.html


这正是我遇到的问题。我不明白为什么try_files不尝试index.php,我一直保持403的“目录索引禁止...”的字样
Travis D

4
@JCM,你能不能加入解释为什么$uri/产生了一个问题?
伊恩·邓恩

解决了矿井以及
alariva

1
我有同样的错误。我有2个站点,都在一个子域中。删除$ uri /就可以了。谢谢!
jivanrij

5
@luminol try_files $uri $uri/意味着从Web根目录尝试uri指向的文件,如果该文件不存在,则尝试使用目录(因此/)。当nginx访问目录时,它将尝试建立索引并将其中的文件列表返回到浏览器/客户端,但是默认情况下,目录索引处于禁用状态,因此它返回错误“ Nginx 403错误:[文件夹]的目录索引”是禁止的”。目录索引由以下autoindex选项控制:nginx.org/en/docs/http/ngx_http_autoindex_module.html
JCM

66

这是有效的配置:

server {
    server_name www.mysite2.name;
    return 301 $scheme://mysite2.name$request_uri;
}
server {
    #This config is based on https://github.com/daylerees/laravel-website-configs/blob/6db24701073dbe34d2d58fea3a3c6b3c0cd5685b/nginx.conf
    server_name mysite2.name;

     # The location of our project's public directory.
    root /usr/share/nginx/mysite2/live/public/;

     # Point index to the Laravel front controller.
    index           index.php;

    location / {
        # URLs to attempt, including pretty ones.
        try_files   $uri $uri/ /index.php?$query_string;
    }

    # Remove trailing slash to please routing system.
    if (!-d $request_filename) {
            rewrite     ^/(.+)/$ /$1 permanent;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
    #   # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    #   # With php5-fpm:
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param                   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

}

然后,浏览器中唯一的输出是Laravel错误:“糟糕,好像出了点问题。”

请勿运行chmod -R 777 app/storage注意)。使某些东西可写入世界是不好的安全性。

chmod -R 755 app/storage 有效且更安全。


1
是的,你们是对的;那是个坏主意。我将更新我的答案。人们也可能会受益于stackoverflow.com/a/11996645/470749
Ryan

1
您也可以选择将文件夹组更改为nginx组,即www-data在debian上。然后在文件夹上设置更严格的权限,例如:chmod -R 640 app/storage然后chown -R :www-data app/storage。这样,文件仅对应用程序所有者和Web服务器可见。而且根本没有人可以直接执行任何已存储(可能已上传)的文件。Nginx应该只需要读取权限即可访问文件。
2014年

3
自我提醒:我刚刚得到这个Nginx的403 再次再次的问题是,我不小心离开public/root /usr/share/nginx/mysitename/public/;。添加public/并运行后service nginx restart,它开始工作。
Ryan

窗户呢?
Himanshu Bansal

58

如果您只是想列出目录内容,请使用以下命令autoindex on;

location /somedir {
       autoindex on;
}

server {
        listen   80;
        server_name  domain.com www.domain.com;
        access_log  /var/...........................;
        root   /path/to/root;
        location / {
                index  index.php index.html index.htm;
        }
        location /somedir {
               autoindex on;
        }
}

9
我绝对不想要autoindex on; 将我的目录内容公开给公众是一个坏主意。
瑞安

5
@Ryan总是归结为“您想做什么?”
Bhargav Nanekalva 2014年

13
很明显,他想删除403错误并让网页显示不显示整个目录的内容(特别是上面的讨论)
-jpmorris

21

我 在/var/log/nginx/error.log的错误日志中遇到了类似的错误
---在网页中出现“ 403禁止访问”
---“ 13:权限被拒绝”

以下3个步骤对我有用:

1:打开终端,看到如下图所示

user1@comp1:/home/www/

因此,我的用户名是“ user1”(从上面)

2:在/etc/nginx/nginx.conf中更改了用户

# user www-data;
user user1;

3:重新加载nginx

sudo nginx -s reload  

此外,我已经应用了文件/文件夹权限(在执行上述3个步骤之前)
(将755应用于我的目录,例如/ dir1 /)和(对于该目录下的文件而言,为644):(
我不确定,是否确实需要执行此附加步骤只需上面的3个步骤就足够了):

chmod 755 ./dir1/
chmod 644 ./dir1/*.*

希望这可以帮助快速有人。祝你好运。


1
谢谢兄弟,我遇到了同样的问题,这是因为权限问题。我设置了文件夹和文件权限,现在可以正常工作了。
Altaf Hussain

2
很高兴听到我的帮助。(在可能的情况下,在空闲时间帮助其他人,在您的已知领域,不要期待任何回报)
Manohar Reddy Poreddy 2015年

很高兴听到它的帮助。
Manohar Reddy Poreddy '18

10

实际上,您需要检查几件事。1.检查您的nginx的运行状态

ps -ef|grep nginx

ps aux|grep nginx|grep -v grep

在这里,我们需要检查谁正在运行nginx。请记住用户和组

  1. 检查文件夹的访问状态

    ls -alt

  2. 与nginx的文件夹状态进行比较

(1)如果文件夹的访问状态不正确

sudo chmod 755 /your_folder_path

(2)如果文件夹的用户和组与nginx的运行用户和组不同

sudo chown your_user_name:your_group_name /your_folder_path

并更改nginx的运行用户名和组

nginx -h

查找nginx配置文件在哪里

sudo vi /your_nginx_configuration_file

//in the file change its user and group
user your_user_name your_group_name;

//restart your nginx
sudo nginx -s reload

因为nginx默认运行的用户是nobody,组是nobody。如果我们没有注意到该用户和组,将引入403。


8

我有同样的问题,日志文件显示了此错误:

2016/03/30 14:35:51 [error] 11915#0: *3 directory index of "path_scripts/viewerjs/" is forbidden, client: IP.IP.IP.IP,     server: domain.com, request: "GET /scripts/viewerjs/ HTTP/1.1", host: "domain", referrer: "domain.com/new_project/do_update"

我正在使用Codeignitor框架托管一个PHP应用程序。当我想查看上传的文件时,收到一个403 Error

问题是,的nginx.conf 定义不正确。代替

index index.html index.htm index.php

我只包括

index index.php

我的根目录中有一个index.php,我认为这足够了,我错了;)提示给了我NginxLibrary


谢谢男人..我在同一条船上..我花了几个小时弄清楚为什么我的wordpress根本不起作用!include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; index index.html index.htm index.php;
Nginx

6

您可能是由于Nginx策略(例如,“拒绝”)而得到的,或者由于Nginx配置错误而得到的,或者是由于文件系统的限制而得到的。

您可以确定是否稍后(并且可以通过使用strace来查看配置错误的证据(除非OP无法访问它):

# pidof nginx
11853 11852

# strace -p 11853 -p 11852 -e trace=file -f
Process 11853 attached - interrupt to quit
Process 11852 attached - interrupt to quit
[pid 11853] stat("/var/www/html/kibanaindex.html", 0x7ffe04e93000) = -1 ENOENT (No such file or directory)
[pid 11853] stat("/var/www/html/kibana", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
^CProcess 11853 detached
Process 11852 detached

在这里,我正在测试运行时由nginx完成的文件系统活动(我和您有同样的错误)。

这是当时我的配置的选定部分

    location /kibana/3/ {
        alias /var/www/html/kibana;
        index index.html;
    }

就我而言,正如strace清楚地表明的那样,“别名”与“索引”的联接不是我所期望的,而且似乎我需要养成总是在目录名后附加/的习惯,因此就我而言,以下工作有效:

    location /kibana/3/ {
        alias /var/www/html/kibana/;
        index index.html;
    }

谢谢你 我知道我没有权限问题,您的评论帮助我找到了解决方案。我在别名的末尾添加了“ /”,它可以正常工作。
kzahel

您是我的英雄@Cameron Kerr,根据我的经验,问题是nginx对别名目录(例如)上找不到的文件提高了403 /home/web/public。为什么Nginx尝试访问这些未找到的文件是因为我忘记删除了这一行,index index.html index.htm index.nginx-debian.html;因为那是文件不在我的公共目录内。
阿贡·普拉塞季

4

看起来像是一些权限问题。

尝试像在mysite1中一样将所有权限设置为其他站点。

默认情况下,文件权限应为644,目录号为755。还要检查运行nginx的用户是否具有读取该文件和目录的权限。


3

更改try_files指向index.php路径,在您提到的“ Laravel”中应该是这样的

location / {
    try_files $uri $uri/ /public/index.php$request_uri;
}

然后在“ codeigniter”项目中尝试这样

location / {
    try_files $uri $uri/ /public_web/index.php$request_uri;
}

3

由于您正在使用php-fpm,因此应确保该php-fpm用户与该用户相同nginx

检查/etc/php-fpm.d/www.conf并设置php用户和组(nginx如果不是)。

php-fpm用户需要写权限。


2

您需要对静态文件目录具有执行权限。另外,还需要您的nginx用户和组对它们进行修改。


1
我认为他只需要对nginx进程具有读取权限?
2014年

2
location ~* \.php$ {
    ...
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;    
}

变更预设

fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

解决了我的问题。


1
6833#0: *1 directory index of "/path/to/your/app" is forbidden, client: 127.0.0.1, server: lol.com, request: "GET / HTTP/1.1", host: "localhost"    

我正在运行Ubuntu 15.10,由于简单的原因,遇到了403 Forbidden错误。在nginx.conf(nginx的配置文件)中,用户为'www-data'。将用户名更改为[我的用户名]后,假设已为我的用户名授予了必要的权限,它就可以正常工作。我遵循的步骤:

chmod 755 /path/to/your/app    

我的配置文件如下所示:

**user [my username]**;#I made the change here.
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}

http {

##
# Basic Settings
##

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;

# server_names_hash_bucket_size 64;
# server_name_in_redirect off;

include /etc/nginx/mime.types;
default_type application/octet-stream;

##
# SSL Settings
##

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;

##
# Logging Settings
##

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

##
# Gzip Settings
##

gzip on;
gzip_disable "msie6";

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

##
# Virtual Host Configs
##

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;


server {
    listen 80;

    server_name My_Server;

    access_log  /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        proxy_pass         http://127.0.0.1:8000;
        proxy_redirect     off;

        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
}
}

1

对我来说,问题是除基本路由以外的任何路由都可以正常工作,添加此行解决了我的问题:

index           index.php;

满满的东西:

server {

    server_name example.dev;
    root /var/www/example/public;
    index           index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

1

为了解决这个问题,我花了一整夜。这是我这个故事的两分钱,

检查您是否使用hhvm作为php解释器。然后它可能正在侦听端口9000,因此您将不得不修改Web服务器的配置。

这是一个旁注:如果您使用的是mysql,并且从hhvm到mysql的连接变得不可能,请检查是否已安装apparmor。禁用它。


0

我解决了我的问题,如果我按照以下方式进行配置:

location = /login {
    index  login2.html;
}

它会显示403错误。

[error] 4212#2916: *2 directory index of "D:\path/to/login/" is forbidden

我已经尝试过autoindex on,但是没有工作。如果我这样更改我的配置,它会起作用。

location = /login/ {
    index  login2.html;
}

我认为完全匹配,如果它是路径应该是目录。


0

当您想保留目录选项时,可以像这样将index.php放在$ uri之前。

try_files /index.php $uri $uri/
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.