Kesalahan Nginx 403: indeks direktori [folder] dilarang

183

Saya memiliki 3 nama domain dan saya mencoba meng-host semua 3 situs pada satu server (tetesan Digital Ocean) menggunakan Nginx.

mysite1.name mysite2.name mysite3.name

Hanya 1 dari mereka yang berfungsi. Dua lainnya menghasilkan 403 kesalahan (dengan cara yang sama).

Dalam log error nginx saya, saya lihat: [error] 13108#0: *1 directory index of "/usr/share/nginx/mysite2.name/live/" is forbidden.

Konfigurasi yang didukung situs saya adalah:

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

Semua 3 situs memiliki file konfigurasi yang hampir identik.

File setiap situs ada di folder seperti /usr/share/nginx/mysite1.name/someFolder, dan /usr/share/nginx/mysite1.name/live adalah symlink untuk itu. (Sama untuk mysite2 dan mysite3.)

Saya telah melihat Nginx 403 terlarang untuk semua file tetapi itu tidak membantu.

Ada ide tentang apa yang mungkin salah?

Ryan
sumber
24
saya pikir Anda memiliki index.html index.phpfile yang hilang, apakah Anda memastikan ada di folder itu?
Mohammad AbuShady
Oh kamu benar; 2 situs yang tidak berfungsi adalah proyek Laravel (yang memiliki index.php di subfolder publik) dan proyek CodeIgniter lama (yang memiliki index.php di subfolder / public_web). Tapi saya tidak yakin bagaimana mengubah konfigurasi saya untuk membuat situs berfungsi.
Ryan
Sama seperti @MohammadAbuShady berkata, saya tidak memiliki file indeks di folder dan mendapat kesalahan ini.
ajon
Aku baru saja kesalahan ini lagi, tapi kali ini masalahnya adalah bahwa saya sengaja akan mengatur rootuntuk menjadi /Users/myUsername/code/appbukan /Users/myUsername/code/app/public.
Ryan
Ini adalah saat admin server bersinar. selengkapnya
OldFart

Jawaban:

171

Jika Anda menonaktifkan pengindeksan direktori, dan mengalami masalah ini, itu mungkin karena try_files yang Anda gunakan memiliki opsi direktori:

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

Hapus itu dan itu akan berfungsi:

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

Kenapa ini terjadi?

TL; DR: Ini disebabkan karena nginx akan mencoba mengindeks direktori, dan diblokir dengan sendirinya. Melempar kesalahan yang disebutkan oleh OP.

try_files $uri $uri/berarti, dari direktori root, coba file yang ditunjuk oleh uri, jika itu tidak ada, coba direktori sebagai gantinya (maka dari itu /). Ketika nginx mengakses direktori, ia mencoba untuk mengindeks dan mengembalikan daftar file di dalamnya ke browser / klien, namun secara default pengindeksan direktori dinonaktifkan, sehingga mengembalikan kesalahan "Nginx 403 error: indeks direktori [folder] terlarang".

Pengindeksan direktori dikendalikan oleh autoindexopsi: https://nginx.org/en/docs/http/ngx_http_autoindex_module.html

JCM
sumber
Ini persis masalah yang saya alami. Saya tidak mengerti mengapa try_filestidak mencoba index.php, saya terus mendapatkan 403 dengan "indeks direktori ... dilarang"
Travis D
4
@ JCM, maukah Anda menambahkan penjelasan mengapa memiliki $uri/masalah?
Ian Dunn
Punyaku terpecahkan
1
Saya memiliki kesalahan yang sama. Saya punya 2 situs, keduanya di subdomain. Menghapus $ uri / berhasil. Terima kasih!
jivanrij
5
@luminol try_files $uri $uri/berarti, dari root web, coba file yang ditunjuk oleh uri, jika itu tidak ada, coba direktori sebagai gantinya (maka dari itu /). Ketika nginx mengakses direktori, ia mencoba untuk mengindeks dan mengembalikan daftar file di dalamnya ke browser / klien, namun secara default pengindeksan direktori dinonaktifkan, sehingga mengembalikan kesalahan "Nginx 403 error: indeks direktori [folder] terlarang". Pengindeksan direktori dikendalikan oleh autoindexopsi: nginx.org/en/docs/http/ngx_http_autoindex_module.html
JCM
67

Berikut adalah konfigurasi yang berfungsi:

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

}

Kemudian satu-satunya output di browser adalah kesalahan Laravel: "Aduh, sepertinya ada yang salah."

JANGAN lari chmod -R 777 app/storage( perhatikan ). Membuat sesuatu yang bisa ditulis dunia adalah keamanan yang buruk.

chmod -R 755 app/storage bekerja dan lebih aman.

Ryan
sumber
1
Ya, kalian benar; itu ide yang buruk. Saya akan memperbarui jawaban saya. Orang-orang juga mungkin mendapat manfaat dari stackoverflow.com/a/11996645/470749
Ryan
1
Anda juga dapat memiliki opsi untuk mengubah grup folder ke grup nginx yaitu www-datapada debian. Lalu atur bahkan lebih ketat izin pada folder seperti: chmod -R 640 app/storagelalu chown -R :www-data app/storage. Dengan cara ini file hanya dapat dilihat oleh pemilik aplikasi dan server web. Dan tidak seorang pun dapat menjalankan file yang disimpan (mungkin diunggah) secara langsung. Nginx seharusnya hanya perlu izin baca untuk mengakses file.
lengkap
3
Catatan untuk diri sendiri: Saya baru saja Nginx ini 403 lagi dan lagi masalahnya adalah bahwa saya telah sengaja meninggalkan off public/di root /usr/share/nginx/mysitename/public/;. Setelah menambahkan public/dan menjalankan service nginx restart, itu berhasil.
Ryan
bagaimana dengan windows?
Himanshu Bansal
58

Jika Anda hanya mencoba daftar isi direktori gunakan autoindex on;seperti:

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;
        }
}
maz
sumber
9
Saya pasti tidak mau autoindex on; itu akan menjadi ide yang buruk untuk mengekspos isi direktori saya kepada publik.
Ryan
5
@Ryan Selalu turun ke "Apa yang ingin Anda lakukan?"
Bhargav Nanekalva
13
Sudah cukup jelas dia ingin menghapus 403 kesalahan dan membuat halaman web menunjukkan tidak menampilkan seluruh isi direktori (khususnya diskusi di atas)
jpmorris
21

Saya mengalami kesalahan serupa
--- "403 Forbidden" di halaman web
--- "13: Izin ditolak" di log kesalahan di /var/log/nginx/error.log

Di bawah 3 Langkah ini berhasil bagi saya:

1: Buka Terminal, lihat sesuatu seperti di bawah ini

user1@comp1:/home/www/

Jadi, nama pengguna saya adalah "user1" (dari atas)

2: Mengubah pengguna di /etc/nginx/nginx.conf

# user www-data;
user user1;

3: Muat ulang nginx

sudo nginx -s reload  

Selain itu, saya telah menerapkan izin file / folder (sebelum saya melakukan di atas 3 langkah)
(755 ke direktori saya, katakan / dir1 /) & (644 untuk file di bawah direktori itu):
(Saya tidak yakin, apakah langkah tambahan ini benar-benar diperlukan, tepat di atas 3 langkah mungkin cukup):

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

Semoga ini bisa membantu seseorang dengan cepat. Semoga berhasil.

Manohar Reddy Poreddy
sumber
1
Terima kasih kawan, saya punya masalah yang sama, dan itu karena izin. Saya mengatur izin folder dan file, dan sekarang berfungsi dengan baik.
Altaf Hussain
2
Senang mendengar saya membantu. (Bantu orang lain, di domain Anda yang dikenal, di waktu luang Anda, jika mungkin, tanpa mengharapkan sesuatu kembali)
Manohar Reddy Poreddy
Senang mendengarnya membantu.
Manohar Reddy Poreddy
10

Sebenarnya ada beberapa hal yang perlu Anda periksa. 1. periksa status menjalankan nginx Anda

ps -ef|grep nginx

ps aux|grep nginx|grep -v grep

Di sini kita perlu memeriksa siapa yang menjalankan nginx. harap ingat pengguna dan grup

  1. periksa status akses folder

    Itu benar

  2. bandingkan dengan status folder dengan nginx

(1) jika status akses folder tidak benar

sudo chmod 755 /your_folder_path

(2) jika pengguna dan grup folder tidak sama dengan nginx's running

sudo chown your_user_name:your_group_name /your_folder_path

dan ubah nama pengguna dan grup yang menjalankan nginx

nginx -h

untuk menemukan di mana file konfigurasi 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

Karena pengguna nginx default running bukan siapa-siapa dan grup bukan siapa-siapa. jika kami belum melihat pengguna dan grup ini, 403 akan diperkenalkan.

Haimei
sumber
8

Saya memiliki masalah yang sama, logfile menunjukkan kesalahan ini kepada saya:

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"

Saya hosting aplikasi PHP dengan framework codeignitor. Ketika saya ingin melihat file yang diunggah saya menerima403 Error .

Masalahnya adalah, bahwa nginx.conf itu tidak didefinisikan dengan benar. Dari pada

index index.html index.htm index.php

saya hanya termasuk

index index.php

Saya memiliki index.php di root saya dan saya pikir itu sudah cukup, saya salah;) Petunjuk itu memberi saya NginxLibrary

theDrifter
sumber
Terima kasih kawan .. Saya menggunakan perahu yang sama .. Saya menghabiskan waktu berjam-jam untuk mencari tahu mengapa wordpress saya tidak berfungsi sama sekali! direktif indeks diperlukan dalam konfigurasi utama nginx agar instalasi wordpress saya berfungsi include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; index index.html index.htm index.php;
mboy
6

Anda mungkin mendapatkan ini karena kebijakan Nginx (mis. "Menyangkal"), atau Anda mungkin mendapatkan ini karena kesalahan konfigurasi Nginx, atau Anda mungkin mendapatkan ini karena pembatasan sistem file.

Anda dapat menentukan apakah ini nanti (dan mungkin melihat bukti kesalahan konfigurasi dengan menggunakan strace (kecuali, OP tidak akan memiliki akses ke sana):

# 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

Di sini saya sedang memeriksa aktivitas filesystem yang dilakukan oleh nginx saat menjalankan tes (saya memiliki kesalahan yang sama seperti Anda).

Inilah bagian yang dipilih dari konfigurasi saya pada saat itu

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

Dalam kasus saya, seperti yang ditunjukkan oleh strace dengan jelas, bergabungnya dalam "alias" ke "indeks" bukanlah yang saya harapkan, dan sepertinya saya perlu membiasakan diri selalu menambahkan nama direktori dengan tanda /, jadi dalam kasus saya, berikut ini berfungsi:

    location /kibana/3/ {
        alias /var/www/html/kibana/;
        index index.html;
    }
Cameron Kerr
sumber
Terima kasih untuk ini. Saya tahu saya tidak memiliki masalah izin dan komentar Anda membantu saya menemukan solusinya. Saya menambahkan "/" di akhir alias saya dan berfungsi dengan baik.
kzahel
Anda adalah pahlawan saya @ameramer Kerr, berdasarkan pengalaman saya masalahnya adalah nginx menaikkan 403 karena tidak ditemukan file pada direktori alias misalnya /home/web/public. Mengapa nginx mencoba mengakses file yang tidak ditemukan ini adalah karena saya lupa menghapus baris ini index index.html index.htm index.nginx-debian.html;karena file thats tidak ada di dalam dir publik saya.
Agung Prasetyo
4

Sepertinya beberapa masalah izin.

Cobalah untuk mengatur semua izin seperti yang Anda lakukan di mysite1 ke situs lain.

Secara default, izin file harus 644 dan dirs 755. Periksa juga apakah pengguna yang menjalankan nginx memiliki izin untuk membaca file dan dir itu.

Tomahock
sumber
3

ubah try_filesuntuk menunjuk ke index.phpjalan, di "Laravel" yang Anda sebutkan itu harus seperti ini

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

Dan dalam proyek "codeigniter", cobalah seperti ini

location / {
    try_files $uri $uri/ /public_web/index.php$request_uri;
}
Mohammad AbuShady
sumber
3

Karena Anda menggunakan php-fpm, Anda harus memastikan bahwa php-fpmpengguna sama dengan nginxpengguna.

Periksa /etc/php-fpm.d/www.confdan atur pengguna dan grup php ke nginxjika bukan.

The php-fpmkebutuhan pengguna izin menulis.

Ali Hashemi
sumber
2

Anda perlu menjalankan izin pada direktori file statis Anda. Mereka juga perlu dikenali oleh pengguna dan grup nginx Anda.

Rhys
sumber
1
Saya pikir dia hanya perlu perlu izin baca untuk proses nginx?
lengkap
2
location ~* \.php$ {
    ...
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;    
}

Ubah default

fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

untuk

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

memecahkan masalah saya.

wave_1102
sumber
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"    

Saya menjalankan Ubuntu 15.10 dan menemukan kesalahan 403 Forbidden karena alasan sederhana. Di nginx.conf (file konfigurasi untuk nginx), pengguna adalah 'www-data'. Setelah saya mengubah nama pengguna menjadi [nama pengguna saya], itu berfungsi dengan baik dengan asumsi izin yang diperlukan diberikan kepada nama pengguna saya. Langkah-langkah yang diikuti oleh saya:

chmod 755 /path/to/your/app    

File konfigurasi saya terlihat seperti ini:

**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;
    }
}
}
Raunaq Kochar
sumber
1

Bagi saya masalahnya adalah bahwa rute apa pun selain rute dasar berfungsi, menambahkan baris ini memperbaiki masalah saya:

index           index.php;

Hal penuh:

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;
    }
}
nol dan satu
sumber
1

Untuk memperbaiki masalah ini saya menghabiskan satu malam penuh. Inilah dua sen saya pada cerita ini,

Periksa apakah Anda menggunakan hhvm sebagai penerjemah php. Maka ada kemungkinan bahwa ia mendengarkan pada port 9000 sehingga Anda harus memodifikasi konfigurasi server web Anda.

Ini adalah catatan tambahan: Jika Anda menggunakan mysql, dan koneksi dari hhvm ke mysql menjadi tidak mungkin, periksa apakah apparmor Anda sudah diinstal. nonaktifkan itu.

pengguna9869932
sumber
0

Saya menyelesaikan masalah saya, jika saya mengonfigurasi suka ikuti:

location = /login {
    index  login2.html;
}

Ini akan menunjukkan kesalahan 403.

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

Saya sudah mencoba autoindex on, tetapi tidak berhasil. Jika saya mengubah konfigurasi saya seperti ini, itu berfungsi.

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

Saya pikir pencocokan yang tepat, jika itu jalan seharusnya direktori.

Robin ong
sumber
0

ketika Anda ingin menyimpan opsi direktori, Anda dapat menempatkan index.php di atas $ uri seperti ini.

try_files /index.php $uri $uri/
xoyabc
sumber