Nginx 403-Fehler: Verzeichnisindex von [Ordner] ist verboten

182

Ich habe 3 Domain-Namen und versuche, alle 3 Sites mit Nginx auf einem Server (einem Digital Ocean-Droplet) zu hosten.

mysite1.name mysite2.name mysite3.name

Nur 1 von ihnen funktioniert. Die anderen beiden führen zu 403 Fehlern (auf die gleiche Weise).

In meinem Nginx-Fehlerprotokoll sehe ich : [error] 13108#0: *1 directory index of "/usr/share/nginx/mysite2.name/live/" is forbidden.

Meine Site-fähige Konfiguration lautet:

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

Alle 3 Sites haben nahezu identische Konfigurationsdateien.

Die Dateien jeder Site befinden sich in Ordnern wie /usr/share/nginx/mysite1.name/someFolder, und dann ist /usr/share/nginx/mysite1.name/live ein Symlink dazu. (Gleiches gilt für mysite2 und mysite3.)

Ich habe mir Nginx 403 für alle Dateien verboten angesehen, aber das hat nicht geholfen.

Irgendwelche Ideen, was falsch sein könnte?

Ryan
quelle
24
Ich denke, Sie haben index.html index.phpDateien fehlen. Haben Sie sichergestellt, dass sie in diesem Ordner vorhanden sind?
Mohammad AbuShady
Oh du hast recht; Die 2 Sites, die nicht funktionieren, sind ein Laravel-Projekt (mit index.php in einem / public-Unterordner) und ein altes CodeIgniter-Projekt (mit index.php in einem / public_web-Unterordner). Ich bin mir jedoch nicht sicher, wie ich meine Konfiguration ändern soll, damit die Websites funktionieren.
Ryan
Genau wie @MohammadAbuShady sagte, ich hatte keine Indexdatei im Ordner und bekam diesen Fehler.
Ajon
Ich habe diesen Fehler wieder, diesmal aber das Problem war , dass ich aus Versehen der eingestellt würde rootsein /Users/myUsername/code/appstatt /Users/myUsername/code/app/public.
Ryan
Dies ist, wenn Serveradministratoren glänzen. Details
OldFart

Antworten:

166

Wenn die Verzeichnisindizierung deaktiviert ist und dieses Problem auftritt, liegt dies wahrscheinlich daran, dass die von Ihnen verwendeten try_files über eine Verzeichnisoption verfügen:

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

Entfernen Sie es und es sollte funktionieren:

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

Warum passiert das?

TL; DR: Dies wird verursacht, weil nginx versucht, das Verzeichnis zu indizieren, und von selbst blockiert wird. Wirft den von OP erwähnten Fehler.

try_files $uri $uri/bedeutet, versuchen Sie aus dem Stammverzeichnis die Datei, auf die das urizeigt. Wenn dies nicht vorhanden ist, versuchen Sie stattdessen ein Verzeichnis (daher das /). Wenn nginx auf ein Verzeichnis zugreift, versucht es, es zu indizieren und die Liste der darin enthaltenen Dateien an den Browser / Client zurückzugeben. Standardmäßig ist die Verzeichnisindizierung jedoch deaktiviert. Daher wird der Fehler "Nginx 403 error: Verzeichnisindex von [Ordner]" zurückgegeben. ist verboten".

Die Verzeichnisindizierung wird über die autoindexOption https://nginx.org/en/docs/http/ngx_http_autoindex_module.html gesteuert

JCM
quelle
Dies ist genau das Problem, das ich hatte. Ich konnte nicht verstehen, warum ich try_fileses nicht versuchte index.php, ich bekam immer wieder 403 mit "Verzeichnisindex von ... ist verboten"
Travis D
4
@JCM, würde es Ihnen etwas ausmachen Zugabe eine Erklärung , warum hat $uri/ein Problem schafft?
Ian Dunn
Auch meine gelöst
Alariva
1
Ich hatte den gleichen Fehler. Ich hatte 2 Sites, beide in einer Subdomain. Das Entfernen des $ uri / hat den Trick gemacht. Vielen Dank!
Jivanrij
5
@luminol try_files $uri $uri/bedeutet, dass Sie vom Webstamm aus die Datei versuchen, auf die die URL zeigt. Wenn diese nicht vorhanden ist, versuchen Sie stattdessen ein Verzeichnis (daher das /). Wenn nginx auf ein Verzeichnis zugreift, versucht es, es zu indizieren und die Liste der darin enthaltenen Dateien an den Browser / Client zurückzugeben. Standardmäßig ist die Verzeichnisindizierung jedoch deaktiviert. Daher wird der Fehler "Nginx 403 error: Verzeichnisindex von [Ordner]" zurückgegeben. ist verboten". Die Verzeichnisindizierung wird durch die autoindexOption gesteuert : nginx.org/en/docs/http/ngx_http_autoindex_module.html
JCM
66

Hier ist die Konfiguration, die funktioniert:

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

}

Dann war die einzige Ausgabe im Browser ein Laravel-Fehler: "Hoppla, es sieht so aus, als ob etwas schief gelaufen ist."

NICHT ausführen chmod -R 777 app/storage( Hinweis ). Etwas weltweit beschreibbar zu machen, ist schlechte Sicherheit.

chmod -R 755 app/storage funktioniert und ist sicherer.

Ryan
quelle
1
Ja, ihr habt recht; Das ist eine schlechte Idee. Ich werde meine Antwort aktualisieren. Menschen könnten auch von stackoverflow.com/a/11996645/470749
Ryan
1
Möglicherweise haben Sie auch die Möglichkeit, die Ordnergruppe in die Nginx-Gruppe zu ändern, dh www-datain Debian. Setzen Sie dann noch strengere Berechtigungen für den Ordner wie: chmod -R 640 app/storagedann chown -R :www-data app/storage. Auf diese Weise sind die Dateien nur für den App-Besitzer und den Webserver sichtbar. Und niemand kann eine der gespeicherten (möglicherweise hochgeladenen) Dateien direkt ausführen. Nginx sollte nur eine Leseberechtigung benötigen, um auf die Dateien zugreifen zu können.
Komplistischer
3
Hinweis zur Selbsthilfe : Ich habe dieses Nginx 403 wieder und wieder das Problem war , dass ich aus Versehen aufgehört hatte public/auf root /usr/share/nginx/mysitename/public/;. Nach dem Hinzufügen public/und Ausführen service nginx restarthat es funktioniert.
Ryan
Was ist mit Windows?
Himanshu Bansal
58

Wenn Sie nur versuchen, Verzeichnisinhalte aufzulisten, verwenden Sie autoindex on;Folgendes:

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
quelle
9
Ich will definitiv nicht autoindex on; Es wäre eine schlechte Idee, meinen Verzeichnisinhalt der Öffentlichkeit zugänglich zu machen.
Ryan
5
@ Ryan Es kommt immer auf "Was willst du tun?"
Bhargav Nanekalva
13
Es ist ziemlich klar, dass er 403 Fehler entfernen und Webseiten anzeigen lassen möchte, dass nicht der gesamte Verzeichnisinhalt angezeigt wird (insbesondere angesichts der obigen Diskussion)
jpmorris
21

Ich habe einen ähnlichen Fehler festgestellt
--- "403 Verboten" auf der Webseite
--- "13: Berechtigung verweigert" im Fehlerprotokoll unter /var/log/nginx/error.log

Die folgenden 3 Schritte haben für mich funktioniert:

1: Terminal öffnen, so etwas wie unten gesehen

user1@comp1:/home/www/

Mein Benutzername ist also "user1" (von oben)

2: Geänderter Benutzer in /etc/nginx/nginx.conf

# user www-data;
user user1;

3: Den Nginx neu geladen

sudo nginx -s reload  

Außerdem habe ich Datei- /
Ordnerberechtigungen angewendet (bevor ich die obigen drei Schritte ausgeführt habe) (755 in meinem Verzeichnis, z. B. / dir1 /) & (644 für Dateien in diesem Verzeichnis):
(Ich bin nicht sicher, ob dieser zusätzliche Schritt wirklich ausgeführt wird erforderlich, knapp über 3 Schritte könnten ausreichen):

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

Hoffe das hilft schnell jemandem. Viel Glück.

Manohar Reddy Poreddy
quelle
1
Danke Bruder, ich hatte das gleiche Problem und es war wegen der Berechtigungen. Ich habe Ordner- und Dateiberechtigungen festgelegt und jetzt funktioniert es einwandfrei.
Altaf Hussain
2
Freut mich zu hören, dass ich hilfreich bin. (Helfen Sie anderen, in Ihrer bekannten Domäne, wenn möglich in Ihrer Freizeit, ohne etwas zurück zu erwarten)
Manohar Reddy Poreddy
Ich bin froh zu hören, dass es geholfen hat.
Manohar Reddy Poreddy
10

In der Tat gibt es mehrere Dinge, die Sie überprüfen müssen. 1. Überprüfen Sie den Betriebsstatus Ihres Nginx

ps -ef|grep nginx

ps aux|grep nginx|grep -v grep

Hier müssen wir überprüfen, wer Nginx ausführt. Bitte denken Sie an den Benutzer und die Gruppe

  1. Überprüfen Sie den Zugriffsstatus des Ordners

    ls -alt

  2. Vergleichen Sie den Status des Ordners mit dem von Nginx

(1) wenn der Zugriffsstatus des Ordners nicht richtig ist

sudo chmod 755 /your_folder_path

(2) wenn der Benutzer und die Gruppe des Ordners nicht mit denen von nginx identisch sind

sudo chown your_user_name:your_group_name /your_folder_path

und ändern Sie den laufenden Benutzernamen und die Gruppe von nginx

nginx -h

um herauszufinden, wo sich die Nginx-Konfigurationsdatei befindet

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

Weil der Benutzer von nginx default running niemand ist und die Gruppe niemand ist. Wenn wir diesen Benutzer und diese Gruppe nicht bemerkt haben, wird 403 eingeführt.

Haimei
quelle
8

Ich hatte das gleiche Problem, die Protokolldatei zeigte mir diesen Fehler:

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"

Ich hoste eine PHP-App mit Codeignitor-Framework. Als ich hochgeladene Dateien anzeigen wollte, erhielt ich eine 403 Error.

Das Problem war, dass das nginx.conf nicht richtig definiert war. Anstatt

index index.html index.htm index.php

Ich habe nur eingeschlossen

index index.php

Ich habe eine index.php in meinem root und ich dachte das wäre genug, ich habe mich geirrt;) Der Hinweis gab mir NginxLibrary

theDrifter
quelle
Danke Mann. Ich war mit demselben Boot. Ich habe Stunden damit verbracht herauszufinden, warum mein WordPress überhaupt nicht funktioniert! Index-Direktive wird in der Nginx-Hauptkonfiguration benötigt, damit meine WordPress-Installation funktioniert include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; index index.html index.htm index.php;
mboy
6

Möglicherweise erhalten Sie dies aufgrund einer Nginx-Richtlinie (z. B. "Verweigern") oder aufgrund einer Nginx-Fehlkonfiguration oder aufgrund von Dateisystemeinschränkungen.

Sie können mithilfe von strace feststellen, ob dies der spätere ist (und möglicherweise Hinweise auf eine Fehlkonfiguration anzeigen (außer, das OP hat keinen Zugriff darauf):

# 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

Hier überprüfe ich die Dateisystemaktivität von nginx, während ein Test ausgeführt wurde (ich hatte den gleichen Fehler wie Sie).

Hier ist ein ausgewählter Teil meiner Konfiguration zu der Zeit

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

In meinem Fall war, wie strace ganz deutlich zeigt, das Zusammenfügen des "Alias" mit dem "Index" nicht das, was ich erwartet hatte, und es scheint, dass ich mir angewöhnen muss, Verzeichnisnamen immer mit einem / zu versehen In meinem Fall hat Folgendes funktioniert:

    location /kibana/3/ {
        alias /var/www/html/kibana/;
        index index.html;
    }
Cameron Kerr
quelle
Danke dafür. Ich wusste, dass ich kein Berechtigungsproblem hatte, und Ihr Kommentar half mir, die Lösung zu finden. Ich habe am Ende meines Alias ​​ein "/" hinzugefügt und es funktioniert einwandfrei.
Kzahel
Sie sind mein Held @Cameron Kerr, basierend auf meiner Erfahrung ist das Problem Nginx Raise 403 für nicht gefundene Dateien im Alias-Verzeichnis, z /home/web/public. Warum nginx versucht, auf diese nicht gefundenen Dateien zuzugreifen, liegt daran, dass ich vergessen habe, diese Zeile zu entfernen, index index.html index.htm index.nginx-debian.html;da sich diese Dateien nicht in meinem öffentlichen Verzeichnis befinden.
Agung Prasetyo
4

Es sieht nach einem Berechtigungsproblem aus.

Versuchen Sie, alle Berechtigungen wie in mysite1 für die andere Site festzulegen.

Standardmäßig sollten die Dateiberechtigungen 644 und dirs 755 sein. Überprüfen Sie auch, ob der Benutzer, der nginx ausführt, die Berechtigung zum Lesen dieser Dateien und dirs hat.

Tomahock
quelle
3

Ändern Sie das try_files, um auf den index.phpPfad zu zeigen, in dem von Ihnen erwähnten "Laravel" sollte es so etwas sein

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

Und im "Codeigniter" -Projekt versuchen Sie es so

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

Da Sie verwenden php-fpm, sollten Sie sicherstellen, dass der php-fpmBenutzer mit dem nginxBenutzer identisch ist .

Überprüfen Sie /etc/php-fpm.d/www.confund stellen Sie PHP-Benutzer und Gruppe auf ein, nginxwenn dies nicht der Fall ist .

Der php-fpmBenutzer benötigt eine Schreibberechtigung.

Ali Hashemi
quelle
2

Sie benötigen eine Ausführungsberechtigung für Ihr statisches Dateiverzeichnis. Außerdem müssen sie von Ihrem Nginx-Benutzer und Ihrer Gruppe chown'ed werden.

Rhys
quelle
1
Ich denke, er braucht nur Leseberechtigung für den Nginx-Prozess?
Komplistischer
2
location ~* \.php$ {
    ...
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;    
}

Standard ändern

fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

zu

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

löste mein Problem.

Wave_1102
quelle
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"    

Ich habe Ubuntu 15.10 ausgeführt und bin aus einem einfachen Grund auf den Fehler 403 Forbidden gestoßen. In der Datei nginx.conf (Konfigurationsdatei für nginx) war der Benutzer 'www-data'. Nachdem ich den Benutzernamen in [meinen Benutzernamen] geändert hatte, funktionierte dies einwandfrei, vorausgesetzt, die erforderlichen Berechtigungen wurden für meinen Benutzernamen erteilt. Von mir verfolgte Schritte:

chmod 755 /path/to/your/app    

Meine Konfigurationsdatei sieht folgendermaßen aus:

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

Für mich war das Problem, dass alle anderen Routen als die Basisroute funktionierten. Durch Hinzufügen dieser Linie wurde mein Problem behoben:

index           index.php;

Volle Sache:

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;
    }
}
Nullen und Einsen
quelle
1

Um dieses Problem zu beheben, habe ich eine ganze Nacht verbracht. Hier sind meine zwei Cent für diese Geschichte:

Überprüfen Sie, ob Sie hhvm als PHP-Interpreter verwenden. Dann ist es möglich, dass Port 9000 abgehört wird, sodass Sie die Konfiguration Ihres Webservers ändern müssen.

Dies ist eine Randnotiz: Wenn Sie MySQL verwenden und Verbindungen von hhvm zu MySQL nicht mehr möglich sind, überprüfen Sie, ob Apparmor installiert ist. deaktiviere es.

user9869932
quelle
0

Ich habe mein Problem gelöst, wenn ich wie folgt konfiguriere:

location = /login {
    index  login2.html;
}

Es wird der 403-Fehler angezeigt.

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

Ich habe es versucht autoindex on, aber es funktioniert nicht. Wenn ich meine Konfiguration so ändere, funktioniert es.

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

Ich denke die genaue Übereinstimmung, wenn es ein Pfad ist, sollte ein Verzeichnis sein.

Robin Ong
quelle
0

Wenn Sie die Verzeichnisoption beibehalten möchten, können Sie die index.php wie folgt vor $ uri setzen.

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