Nginx 403エラー:[フォルダ]のディレクトリインデックスは禁止されています


183

3つのドメイン名があり、Nginxを使用して3つのサイトすべてを1つのサーバー(Digital Oceanドロップレット)でホストしようとしています。

mysite1.name mysite2.name mysite3.name

そのうちの1つだけが機能します。他の2つは(同じ方法で)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年

ああ、あなたは正しいです。機能していない2つのサイトは、Laravelプロジェクト(/ publicサブフォルダーにindex.phpがある)と古いCodeIgniterプロジェクト(/ public_webサブフォルダーにindex.phpがある)です。しかし、サイトを機能させるために構成を変更する方法がわかりません。
Ryan

@MohammadAbuShadyが言ったように、フォルダーにインデックスファイルがなく、このエラーが発生しました。
ajon 2017年

もう一度このエラーが発生しましたが、今度はをの代わりにに設定しrootてしまったことが問題でした。/Users/myUsername/code/app/Users/myUsername/code/app/public
ライアン

これは、サーバー管理者が輝くときです。詳細
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 error:directory index of [folder]が返されます。禁止されています"。

ディレクトリのインデックス作成は、autoindexオプションによって制御されます:https : //nginx.org/en/docs/http/ngx_http_autoindex_module.html


これはまさに私が抱えていた問題です。なぜtry_files試行しなかったのか理解できませんindex.phpでした。「...のディレクトリインデックスは禁止されています」という403を取得し続けました
Travis D

4
@JCM、問題が発生する理由を説明してください$uri/
Ian Dunn

私も解決しました
アリヴァ2017

1
同じエラーが発生しました。2つのサイトがあり、どちらもサブドメインにありました。$ uri /を削除することがトリックを実行しました。ありがとう!
jivanrij

5
@luminol try_files $uri $uri/は、Webルートから、uriがポイントするファイルを試すことを意味します/。それが存在しない場合は、代わりにディレクトリを試してください(したがって)。nginxがディレクトリにアクセスすると、インデックスを作成し、その中のファイルのリストをブラウザ/クライアントに返しますが、デフォルトではディレクトリのインデックス作成が無効になっているため、エラー「Nginx 403 error:directory index of [folder]が返されます。禁止されています"。ディレクトリのインデックス作成は、autoindexオプションによって制御されます:nginx.org/en/docs/http/ngx_http_autoindex_module.html
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の
ライアン

1
また、フォルダーグループをnginxグループ(www-datadebian など)に変更することもできます。その後のようなフォルダにさらに厳しい権限を設定する: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
@ライアンいつも「どうしたいの?」
Bhargav Nanekalva 2014

13
403エラーを削除し、Webページにディレクトリの内容全体が表示されないように表示することを望んでいることは明らかです(上記の説明を
踏まえると

21

/var/log/nginx/error.logのエラーログで同様のエラー
---「403 Forbidden」
---「13:Permission denied」が発生しました

以下の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

それが役に立ったと聞いてうれしい。
Manohar Reddy Poreddy、2018年

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を与えました


男に感謝..私は同じボートに乗っていた..私のワードプレスがまったく機能しない理由を理解するのに何時間も費やした!私のワードプレスのインストールが機能するには、nginxのメイン構成でインデックスディレクティブが必要です include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; index index.html index.htm index.php;
mboy

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

これをありがとう。権限の問題がないことは知っていました。あなたのコメントが解決策を見つけるのに役立ちました。エイリアスの末尾に「/」を追加すると、正常に機能します。
kzahel 2016

あなたは私のヒーローです@Cameron Kerr、私の経験に基づくと、問題はエイリアスディレクトリに見つからないファイルのnginxレイズ403です/home/web/public。nginxがこれらの見つからないファイルにアクセスしようとするのindex index.html index.htm index.nginx-debian.html;は、そのファイルが私の公開ディレクトリ内にないため、この行を削除するのを忘れたためです。
Agung Prasetyo 2016

4

権限の問題のようです。

mysite1で行ったように、すべての権限を他のサイトに設定してみてください。

デフォルトでは、ファイル権限は644とdirs 755にする必要があります。また、nginxを実行するユーザーがそのファイルとdirsを読み取る権限を持っているかどうかも確認してください。


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-fpmphp-fpmユーザーが同じであることを確認する必要がありますnginxます。

/etc/php-fpm.d/www.confphpユーザーとグループを確認して設定します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」でした。ユーザー名を[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

この問題を解決するために、私は一晩過ごしました。これがこの話の私の2セントです。

PHPインタープリターとしてhhvmを使用しているかどうかを確認してください。その後、ポート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

ディレクトリオプションを保持する場合は、このように$ uriの前にindex.phpを配置できます。

try_files /index.php $uri $uri/
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.