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

时间:2013-10-10 01:00:29

标签: configuration nginx http-status-code-403 domain-name

我有3个域名,我正在尝试使用Nginx在一台服务器(数字海洋水滴)上托管所有3个网站。

mysite1.name mysite2.name mysite3.name

其中只有一个有效。另外两个导致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 forbidden for all files但这没有帮助。

关于可能出错的任何想法?

22 个答案:

答案 0 :(得分:114)

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

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

删除它,它应该工作:

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

从我所看到的,这是因为nginx将尝试索引目录,并被自己阻止。抛出OP提到的错误。

答案 1 :(得分:59)

以下是适用的配置:

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/storagenote)。制作世界可写的东西是不好的安全措施。

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

答案 2 :(得分:54)

如果您只是尝试列出目录内容,请使用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;
        }
}

答案 3 :(得分:19)

我遇到了类似的错误  ---" 403禁止"在网页上  ---" 13:许可被拒绝"在/var/log/nginx/error.log

的错误日志中

以下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/*.*

希望这有助于快速吸引某些人。祝你好运。

答案 4 :(得分:7)

我遇到了同样的问题,日志文件向我显示了这个错误:

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

我的root中有一个index.php,我认为这就够了,我错了;) 提示给了我NginxLibrary

答案 5 :(得分:6)

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

ps -ef|grep nginx

ps aux|grep nginx|grep -v grep

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

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

    ls -alt

  2. 使用nginx的

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

    (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而group是nobody。如果我们没有注意到这个用户和组,将引入403。

答案 6 :(得分:6)

你可能因为Nginx策略(例如“deny”)而得到这个,或者你可能因为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;
    }

答案 7 :(得分:3)

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

尝试将您在mysite1中所做的所有权限设置为其他网站。

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

答案 8 :(得分:3)

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

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

php-fpm用户需要写入权限。

答案 9 :(得分:2)

这是我在 Kali 机器上修复它的方法:

  • 定位到目录:

    cd /etc/nginx/sites-enabled/

  • 编辑“默认”配置文件:

    sudo nano default

  • location 块中添加以下几行:

    location /yourdirectory {
      autoindex on;
      autoindex_exact_size off;
    }
    
  • 请注意,我已在特定目录中激活自动索引 仅限/yourdirectory。否则,它将为您计算机上的所有文件夹启用而您不想要它。

  • 现在重启你的服务器,它现在应该可以工作了:

    sudo service nginx restart

答案 10 :(得分: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;

解决了我的问题。

答案 11 :(得分:2)

您需要对静态文件目录具有执行权限。此外,他们还需要由你的nginx用户和小组进行chown。

答案 12 :(得分:2)

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;
}

答案 13 :(得分: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;
    }
}
}

答案 14 :(得分:0)

对我来说问题是除了基本路线以外的任何路线都在工作,添加这一行解决了我的问题:

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;
    }
}

答案 15 :(得分: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;
}

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

答案 16 :(得分:0)

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

try_files /index.php $uri $uri/

答案 17 :(得分:0)

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

  

检查是否使用 hhvm 作为php解释器。那有可能   它正在侦听端口9000,因此您必须修改自己的网站   服务器的配置。

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

答案 18 :(得分:0)

location / {
root  fileLocation;
index  index.html index.htm;
expires 0;
if_modified_since off;}

在这里,我使用alias而不是root,这导致了我的错误。此配置工作正常。

答案 19 :(得分:0)

  1. 检查目录中是否没有缺少index.html或index.php
  2. 查看错误日志文件,该文件位于/ var / log / nginx中,然后打开vim error.log

答案 20 :(得分:0)

就我而言,它与CentOS 7中的SELinux有关:

您可以通过运行以下命令来检查它是否已启用:

cat /etc/selinux/config

样本输出:

SELINUX=enforcing
SELINUXTYPE=targeted

永久禁用SELinux 编辑/ etc / selinux / config文件,运行:

sudo vi /etc/selinux/config

将SELINUX设置为禁用:

SELINUX=disabled

保存并关闭vi / vim中的文件。重新启动Linux系统:

sudo reboot

答案 21 :(得分:0)

就我而言,我没有运行此命令

daemonset