Nginx 403 오류 : [폴더]의 디렉토리 색인이 금지되어 있습니다.


183

나는 3 개의 도메인 이름을 가지고 있으며 Nginx를 사용하여 하나의 서버 (Digital Ocean droplet)에서 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이 모든 파일에 대해 금지되어있는 것을 보았지만 도움이되지 않았습니다.

무엇이 잘못되었을 지에 대한 아이디어가 있습니까?


24
index.html index.php파일이 누락 된 것 같습니다 . 해당 폴더에 파일이 있는지 확인 했습니까?
Mohammad AbuShady

아 맞아; 작동하지 않는 두 사이트는 Laravel 프로젝트 (/ public 하위 폴더에 index.php가 있음)와 이전 CodeIgniter 프로젝트 (/ public_web 하위 폴더에 index.php가 있음)입니다. 그러나 사이트가 작동하도록 구성을 변경하는 방법을 잘 모르겠습니다.
Ryan

@MohammadAbuShady가 말했듯이 폴더에 색인 파일이 없으며이 오류가 발생했습니다.
ajon

난 그냥 다시이 오류를 얻었으나, 이번에는 문제는 내가 실수로 설정 한 것이었다 root/Users/myUsername/code/app대신 /Users/myUsername/code/app/public.
Ryan

서버 관리자가 빛을 발할 때입니다. 세부 사항
OldFart

답변:


171

디렉토리 색인이 해제되어 있고이 문제점이 발생하는 경우, 사용중인 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 오류 : 디렉토리 폴더의 [폴더] 금지되어 있습니다. "

디렉토리 색인 생성은 https://nginx.org/en/docs/http/ngx_http_autoindex_module.htmlautoindex 옵션으로 제어됩니다 .


이것은 내가 겪고있는 문제입니다. 나는 왜 try_files시도하지 않았 는지 이해할 수 없었다 index.php. 나는 단지 "403의 디렉토리 색인은 금지되어있다"라는 403을 계속
Travis D

4
@JCM, 당신은에 대한 설명 추가 줄래 이유를 갖는 $uri/문제를 만듭니다?
Ian Dunn

또한 해결
alariva

1
나는 같은 오류가 있었다. 하위 도메인에 2 개의 사이트가 있습니다. $ uri /를 제거하면 트릭을 만들었습니다. 감사!
jivanrij

5
@luminol try_files $uri $uri/은 웹 루트에서 uri가 가리키는 파일을 시도하고 존재하지 않는 경우 디렉토리를 시도하십시오 (따라서 /). nginx가 디렉토리에 액세스 할 때 디렉토리를 색인화하고 그 안에있는 파일 목록을 브라우저 / 클라이언트에 리턴하려고 시도하지만 기본적으로 디렉토리 색인화가 사용 불가능하므로 "Nginx 403 오류 : 디렉토리 폴더의 [폴더] 금지되어 있습니다. " 디렉토리 색인 생성은 nginx.org/en/docs/http/ngx_http_autoindex_module.htmlautoindex
JCM

67

작동하는 구성은 다음과 같습니다.

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데비안) 으로 변경할 수도 있습니다 . 다음과 같은 폴더도 엄격한 권한을 설정 : chmod -R 640 app/storage다음 chown -R :www-data app/storage. 이런 식으로 파일은 앱 소유자와 웹 서버에서만 볼 수 있습니다. 그리고 저장된 (아마도 업로드 된) 파일을 직접 실행할 수있는 사람은 없습니다. Nginx는 파일에 액세스 할 수있는 읽기 권한 만 있으면됩니다.
Complistic

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. 내 디렉토리 내용을 대중에게 공개하는 것은 나쁜 생각입니다.
Ryan

5
@Ryan 항상 "무엇을하고 싶니?"
Bhargav Nanekalva

13
403 오류를 제거하고 전체 디렉토리 내용을 표시하지 않는 웹 페이지를 표시하려고합니다 (위 설명에서 언급)
jpmorris

21

/var/log/nginx/error.log의 오류 로그에서 비슷한 오류가 발생했습니다.
--- 웹 페이지에서 "403 Forbidden"
--- "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 레디 Poreddy

도움이되었다 니 다행입니다.
Manohar Reddy Poreddy

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이고 group은 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를 주었다.


고마워요 .. 같은 보트에 있었는데 .. 왜 워드 프레스가 전혀 작동하지 않는지 알아 내기 위해 몇 시간을 보냈습니다! 내 워드 프레스 설치가 작동하려면 nginx 기본 구성에 색인 지시문이 필요합니다 include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; index index.html index.htm index.php;
mboy

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가 명확하게 보여 주듯이 "alias"에서 "index"에 합류하는 것은 내가 예상 한 것이 아니며 항상 /로 디렉토리 이름을 추가하는 습관을들이는 것처럼 보입니다. 내 경우에는 다음이 효과가있었습니다.

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

고마워 권한 문제가 없음을 알고 귀하의 의견이 솔루션을 찾는 데 도움이되었습니다. 별칭 끝에 "/"를 추가했는데 정상적으로 작동합니다.
kzahel

내 경험에 따르면 내 영웅 @Cameron Kerr입니다. 문제는 별칭 디렉토리에서 파일을 찾을 수없는 경우 nginx raise 403입니다 /home/web/public. 왜 nginx가 찾을 수없는 파일에 액세스하려고하는 이유는 index index.html index.htm index.nginx-debian.html;파일이 내 공용 디렉토리에 없기 때문에이 줄을 제거하는 것을 잊었 기 때문 입니다.
Agung Prasetyo

4

권한 문제처럼 보입니다.

mysite1에서했던 것처럼 모든 permisions를 다른 사이트로 설정하십시오.

기본적으로 파일 권한은 644와 dirs 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.confPHP 사용자 및 그룹이 nginx아닌지 확인 하고 설정 하십시오 .

php-fpm사용자가 쓰기 권한이 필요합니다.


2

정적 파일 디렉토리에 대한 실행 권한이 필요합니다. 또한 nginx 사용자 및 그룹에 의해 chown'ed해야합니다.


1
나는 그가 nginx 프로세스에 대한 읽기 권한이 필요하다고 생각합니까?
complistic

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"    

우분투 15.10을 실행 중이며 간단한 이유로 403 Forbidden 오류가 발생했습니다. nginx.conf (nginx 구성 파일)에서 사용자는 'www-data'였습니다. 사용자 이름을 [my username (사용자 이름)]으로 변경 한 후에는 필요한 사용자 이름이 내 사용자 이름에 부여되었다고 가정했을 때 정상적으로 작동했습니다. 다음 단계 :

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

이 문제를 해결하기 위해 밤새도록 보냈습니다. 이 이야기에 내 두 센트가 있습니다.

PHP 인터프리터로 hhvm 을 사용하고 있는지 확인하십시오 . 그런 다음 포트 9000에서 수신 대기 중일 수 있으므로 웹 서버의 구성을 수정해야합니다.

참고 사항 : 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/
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.