Errore Nginx 403: è vietato l'indice di directory di [cartella]


183

Ho 3 nomi di dominio e sto cercando di ospitare tutti e 3 i siti su un server (un droplet Digital Ocean) usando Nginx.

mysite1.name mysite2.name mysite3.name

Solo 1 di loro funziona. Gli altri due comportano 403 errori (allo stesso modo).

Nel mio log degli errori nginx, vedo: [error] 13108#0: *1 directory index of "/usr/share/nginx/mysite2.name/live/" is forbidden.

La mia configurazione abilitata per i siti è:

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

Tutti e 3 i siti hanno file di configurazione quasi identici.

I file di ogni sito si trovano in cartelle come /usr/share/nginx/mysite1.name/someFolder, quindi /usr/share/nginx/mysite1.name/live è un link simbolico a quello. (Lo stesso per mysite2 e mysite3.)

Ho esaminato Nginx 403 vietato per tutti i file, ma non è stato d'aiuto.

Qualche idea su cosa potrebbe essere sbagliato?


24
penso che index.html index.phpmanchi qualche file, ti sei assicurato che esistessero in quella cartella?
Mohammad AbuShady,

Oh hai ragione; i 2 siti che non funzionano sono un progetto Laravel (che ha index.php in una sottocartella / public) e un vecchio progetto CodeIgniter (che ha index.php in una sottocartella / public_web). Ma non sono sicuro di come modificare la mia configurazione per far funzionare i siti.
Ryan,

Proprio come ha detto @MohammadAbuShady, non avevo un file indice nella cartella e ho riscontrato questo errore.
ajon,

Ho appena ricevuto di nuovo questo errore, ma questa volta il problema era che avevo impostato accidentalmente rootessere /Users/myUsername/code/appinvece di /Users/myUsername/code/app/public.
Ryan,

Questo è quando gli amministratori del server brillano. dettagli
OldFart

Risposte:


171

Se l'indicizzazione della directory è disattivata e si verifica questo problema, probabilmente è perché i file try_files in uso hanno un'opzione directory:

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

Rimuovilo e dovrebbe funzionare:

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

Perché questo succede

TL; DR: questo è causato dal fatto che nginx tenterà di indicizzare la directory e verrà bloccato da solo. Lancio dell'errore citato dall'OP.

try_files $uri $uri/significa, dalla directory principale, provare il file indicato da uri, se non esiste, provare invece una directory (da qui /). Quando nginx accede a una directory, tenta di indicizzarla e restituisce l'elenco di file al suo interno al browser / client, tuttavia per impostazione predefinita l'indicizzazione della directory è disabilitata e quindi restituisce l'errore "Errore Nginx 403: indice directory di [cartella] è vietato".

L'indicizzazione delle directory è controllata autoindexdall'opzione: https://nginx.org/en/docs/http/ngx_http_autoindex_module.html


Questo è esattamente il problema che stavo avendo. Non riuscivo a capire perché try_filesnon ci provassi index.php, continuavo a ricevere 403 con "l'indice di directory di ... è proibito"
Travis D

4
@JCM, ti dispiacerebbe aggiungere una spiegazione del perché aver $uri/creato un problema?
Ian Dunn,

Risolto anche il mio
alariva il

1
Ho avuto lo stesso errore. Avevo 2 siti, entrambi in un sottodominio. Rimuovere $ uri / ha fatto il trucco. Grazie!
jivanrij,

5
@luminol try_files $uri $uri/significa, dalla radice web, provare il file puntato dall'uri, se non esiste, provare invece una directory (da qui /). Quando nginx accede a una directory, tenta di indicizzarla e restituisce l'elenco di file al suo interno al browser / client, tuttavia per impostazione predefinita l'indicizzazione della directory è disabilitata e quindi restituisce l'errore "Errore Nginx 403: indice directory di [cartella] è vietato". L'indicizzazione delle directory è controllata autoindexdall'opzione: nginx.org/en/docs/http/ngx_http_autoindex_module.html
JCM

67

Ecco la configurazione che funziona:

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

}

Quindi l'unico output nel browser è stato un errore Laravel: "Whoops, sembra che qualcosa sia andato storto."

NON eseguire chmod -R 777 app/storage( nota ). Fare qualcosa di scrivibile dal mondo è una cattiva sicurezza.

chmod -R 755 app/storage funziona ed è più sicuro.


1
Sì, ragazzi avete ragione; è una cattiva idea. Aggiornerò la mia risposta. Le persone potrebbero anche trarre vantaggio da stackoverflow.com/a/11996645/470749
Ryan

1
Potresti anche avere la possibilità di cambiare il gruppo di cartelle nel gruppo nginx, cioè www-datasu debian. Quindi impostare autorizzazioni ancora più severe sulla cartella come: chmod -R 640 app/storagethen chown -R :www-data app/storage. In questo modo i file sono visibili solo al proprietario dell'app e al server web. E nessuno può eseguire direttamente nessuno dei file memorizzati (eventualmente caricati). Nginx dovrebbe avere solo bisogno dell'autorizzazione in lettura per accedere ai file.
complistico

3
Nota per sé: Ho appena ricevuto questa Nginx 403 ancora una volta e ancora una volta il problema era che avevo accidentalmente lasciato fuori public/su root /usr/share/nginx/mysitename/public/;. Dopo aver aggiunto public/ed eseguito service nginx restart, ha funzionato.
Ryan,

che dire di windows?
Himanshu Bansal

58

Se stai semplicemente cercando di elencare i contenuti della directory, usa autoindex on;come:

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
Non voglio assolutamente autoindex on; sarebbe una cattiva idea esporre i contenuti della mia directory al pubblico.
Ryan,

5
@Ryan Si riduce sempre a "Cosa vuoi fare?"
Bhargav Nanekalva,

13
È abbastanza chiaro che vuole rimuovere 403 errori e ottenere pagine Web che mostrano di non visualizzare l'intero contenuto della directory (specialmente la discussione sopra)
jpmorris,

21

Ho riscontrato un errore simile
--- "403 Proibito" nella pagina Web
--- "13: Autorizzazione negata" nel registro errori su /var/log/nginx/error.log

Sotto 3 passaggi ha funzionato per me:

1: Apri Terminale, ho visto qualcosa di simile sotto

user1@comp1:/home/www/

Quindi, il mio nome utente è "user1" (dall'alto)

2: Utente modificato in /etc/nginx/nginx.conf

# user www-data;
user user1;

3: ricaricato il nginx

sudo nginx -s reload  

Inoltre, ho applicato le autorizzazioni per file / cartelle (prima di aver fatto sopra 3 passaggi)
(755 nella mia directory, dire / dir1 /) & (644 per i file in quella directory):
(Non sono sicuro, se questo passaggio aggiuntivo è davvero richiesto, appena sopra 3 passaggi potrebbero essere sufficienti):

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

Spero che questo aiuti qualcuno veloce. Buona fortuna.


1
Grazie fratello, ho avuto lo stesso problema ed è stato a causa delle autorizzazioni. Ho impostato le autorizzazioni per le cartelle e i file e ora funziona correttamente.
Altaf Hussain,

2
Sono contento di sentire che sono utile. (Aiuta gli altri, nel tuo dominio noto, nel tuo tempo libero, se possibile, senza aspettarti nulla di nuovo)
Manohar Reddy Poreddy

Sono contento di sentirlo aiutato.
Manohar Reddy Poreddy,

10

In effetti ci sono diverse cose che devi controllare. 1. controlla lo stato di esecuzione del tuo nginx

ps -ef|grep nginx

ps aux|grep nginx|grep -v grep

Qui dobbiamo controllare chi esegue nginx. ricorda l'utente e il gruppo

  1. controlla lo stato di accesso alla cartella

    ls -alt

  2. confrontare con lo stato della cartella con nginx

(1) se lo stato di accesso alla cartella non è corretto

sudo chmod 755 /your_folder_path

(2) se l'utente e il gruppo della cartella non sono gli stessi con quelli di nginx

sudo chown your_user_name:your_group_name /your_folder_path

e cambia il nome utente e il gruppo in esecuzione di nginx

nginx -h

per trovare dov'è il file di configurazione di 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

Perché l'utente di nginx default running non è nessuno e il gruppo non è nessuno. se non abbiamo notato questo utente e questo gruppo, verrà introdotto 403.


8

Ho avuto lo stesso problema, il file di registro mi ha mostrato questo errore:

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"

Sto ospitando un'app PHP con framework codeignitor. Quando volevo visualizzare i file caricati ho ricevuto un 403 Error.

Il problema era che nginx.conf non era stato definito correttamente. Invece di

index index.html index.htm index.php

ho solo incluso

index index.php

Ho un index.php nella mia radice e ho pensato che fosse abbastanza, mi sbagliavo;) Il suggerimento mi ha dato NginxLibrary


Grazie all'uomo .. Ero con la stessa barca .. Ho passato ore a capire perché il mio wordpress non funziona affatto! la direttiva index è necessaria nella configurazione principale di nginx per far funzionare la mia installazione di wordpress include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; index index.html index.htm index.php;
mboy

6

Potresti ottenerlo a causa della politica di Nginx (ad es. "Nega"), oppure potresti ottenerlo a causa della configurazione errata di Nginx, oppure potresti ottenerlo a causa delle restrizioni del filesystem.

Puoi determinare se è il successivo (e possibilmente vedere le prove di una configurazione errata usando strace (tranne, l'OP non avrà accesso a quello):

# 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

Qui sto ispezionando l'attività del filesystem eseguita da nginx mentre eseguivo un test (ho avuto lo stesso errore di te).

Ecco una parte selezionata della mia configurazione al momento

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

Nel mio caso, come mostra chiaramente Strace, l'unione di "alias" con "indice" non era quella che mi aspettavo, e sembra che dovrei prendere l'abitudine di aggiungere sempre nomi di directory con un /, quindi nel mio caso, ha funzionato:

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

Grazie per questo. Sapevo di non avere problemi con le autorizzazioni e il tuo commento mi ha aiutato a trovare la soluzione. Ho aggiunto un "/" alla fine del mio alias e funziona benissimo.
kzahel,

sei il mio eroe @Cameron Kerr, in base alla mia esperienza il problema è nginx aumentare 403 per i file non trovati nella directory alias ad es /home/web/public. Perché nginx tenta di accedere a questi file non trovati è perché ho dimenticato di rimuovere questa riga index index.html index.htm index.nginx-debian.html;poiché i file non si trovano nella mia directory pubblica.
Agung Prasetyo,

4

Sembra un problema con le autorizzazioni.

Prova a impostare tutte le autorizzazioni come hai fatto in mysite1 sull'altro sito.

Per impostazione predefinita, le autorizzazioni per i file dovrebbero essere 644 e dirs 755. Controlla anche se l'utente che esegue nginx ha il permesso di leggere quei file e dir.


3

cambia il try_filesper indicare il index.phppercorso, nel "Laravel" che hai citato, dovrebbe essere qualcosa del genere

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

E nel progetto "codeigniter" provalo in questo modo

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

3

Poiché stai utilizzando php-fpm, dovresti assicurarti che l' php-fpmutente sia uguale nginxall'utente.

Controlla /etc/php-fpm.d/www.confe imposta php user e group su nginxse non lo è.

L' php-fpmutente ha bisogno del permesso di scrittura.


2

È necessario eseguire l'autorizzazione sulla directory dei file statici. Inoltre devono essere controllati dall'utente e dal gruppo nginx.


1
Penso che abbia solo bisogno di un permesso di lettura per il processo nginx?
complistico

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

Cambia impostazione predefinita

fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

per

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

risolto il mio problema


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"    

Stavo eseguendo Ubuntu 15.10 e ho riscontrato l'errore 403 Forbidden a causa di un semplice motivo. Nel nginx.conf (file di configurazione per nginx), l'utente era "www-data". Una volta cambiato il nome utente in [mio nome utente], ha funzionato bene supponendo che fossero state concesse le autorizzazioni necessarie al mio nome utente. Passaggi seguiti da me:

chmod 755 /path/to/your/app    

Il mio file di configurazione è simile al seguente:

**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

Per me il problema era che qualsiasi percorso diverso da quello di base funzionava, l'aggiunta di questa linea risolveva il mio problema:

index           index.php;

Cosa completa:

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

Per risolvere questo problema ho trascorso un'intera notte. Ecco i miei due centesimi su questa storia,

Controlla se stai usando hhvm come interprete php. Quindi è possibile che sia in ascolto sulla porta 9000, quindi dovrai modificare la configurazione del tuo server web.

Questa è una nota a margine: se stai usando mysql e le connessioni da hhvm a mysql diventano impossibili, controlla se hai installato apparmor . disabilitalo.


0

Ho risolto il mio problema, se configuro come segue:

location = /login {
    index  login2.html;
}

Mostrerà l'errore 403.

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

Ho provato autoindex on, ma non funziona. Se cambio la mia configurazione in questo modo, funziona.

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

Penso che la corrispondenza esatta, se è un percorso dovrebbe essere una directory.


0

quando vuoi mantenere l'opzione di directory, puoi mettere index.php davanti a $ uri in questo modo.

try_files /index.php $uri $uri/
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.