Erreur Nginx 403: l'index de répertoire de [dossier] est interdit

183

J'ai 3 noms de domaine et j'essaie d'héberger les 3 sites sur un serveur (une gouttelette Digital Ocean) en utilisant Nginx.

mysite1.name mysite2.name mysite3.name

Seul 1 d'entre eux fonctionne. Les deux autres entraînent 403 erreurs (de la même manière).

Dans mon erreur nginx journal, je vois: [error] 13108#0: *1 directory index of "/usr/share/nginx/mysite2.name/live/" is forbidden.

Ma configuration activée pour les sites est:

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

Les 3 sites ont des fichiers de configuration presque identiques.

Les fichiers de chaque site sont dans des dossiers tels que /usr/share/nginx/mysite1.name/someFolder, et ensuite /usr/share/nginx/mysite1.name/live est un lien symbolique vers cela. (Idem pour mysite2 et mysite3.)

J'ai regardé Nginx 403 interdit pour tous les fichiers mais cela n'a pas aidé.

Des idées sur ce qui ne va pas?

Ryan
la source
24
Je pense que vous avez des index.html index.phpfichiers manquants, vous êtes-vous assuré qu'ils existent dans ce dossier?
Mohammad AbuShady
Oh tu as raison; les 2 sites qui ne fonctionnent pas sont un projet Laravel (qui a index.php dans un sous-dossier / public) et un ancien projet CodeIgniter (qui a index.php dans un sous-dossier / public_web). Mais je ne sais pas comment modifier ma configuration pour que les sites fonctionnent.
Ryan
Tout comme @MohammadAbuShady l'a dit, je n'avais pas de fichier d'index dans le dossier et j'ai eu cette erreur.
ajon
Je viens rootde recevoir à nouveau cette erreur, mais cette fois, le problème était que j'avais accidentellement défini le comme étant /Users/myUsername/code/appau lieu de /Users/myUsername/code/app/public.
Ryan
C'est là que les administrateurs du serveur brillent. détails
OldFart

Réponses:

171

Si vous avez désactivé l'indexation des répertoires et que vous rencontrez ce problème, c'est probablement parce que les fichiers try_files que vous utilisez ont une option de répertoire:

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

Retirez-le et cela devrait fonctionner:

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

Pourquoi cela arrive

TL; DR: Ceci est dû au fait que nginx essaiera d'indexer le répertoire et sera bloqué par lui-même. Lancement de l'erreur mentionnée par OP.

try_files $uri $uri/signifie, à partir du répertoire racine, essayez le fichier pointé par le uri, si cela n'existe pas, essayez un répertoire à la place (d'où le /). Lorsque nginx accède à un répertoire, il essaie de l'indexer et de renvoyer la liste des fichiers qu'il contient au navigateur / client, mais par défaut, l'indexation des répertoires est désactivée et renvoie donc l'erreur "Erreur Nginx 403: index de répertoire de [dossier] est interdit".

L'indexation des répertoires est contrôlée par l' autoindexoption: https://nginx.org/en/docs/http/ngx_http_autoindex_module.html

JCM
la source
C'est exactement le problème que j'avais. Je ne pouvais pas comprendre pourquoi je try_filesn'essayais pas index.php, j'ai juste continué à obtenir 403 avec "l'index du répertoire de ... est interdit"
Travis D
4
@JCM, auriez - vous l'ajout d' une explication de pourquoi avoir $uri/crée un problème?
Ian Dunn
Résolu le mien aussi
alariva
1
J'ai eu la même erreur. J'avais 2 sites, tous deux dans un sous-domaine. La suppression du $ uri / a fait l'affaire. Merci!
jivanrij
5
@luminol try_files $uri $uri/signifie, à partir de la racine Web, essayez le fichier pointé par l'URI, si cela n'existe pas, essayez un répertoire à la place (d'où le /). Lorsque nginx accède à un répertoire, il essaie de l'indexer et de renvoyer la liste des fichiers qu'il contient au navigateur / client, mais par défaut, l'indexation des répertoires est désactivée et renvoie donc l'erreur "Erreur Nginx 403: index de répertoire de [dossier] est interdit". L'indexation des répertoires est contrôlée par l' autoindexoption: nginx.org/en/docs/http/ngx_http_autoindex_module.html
JCM
67

Voici la config qui fonctionne:

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

}

Ensuite, la seule sortie dans le navigateur était une erreur Laravel: "Oups, il semble que quelque chose s'est mal passé."

NE PAS courir chmod -R 777 app/storage( note ). Rendre quelque chose d'inscriptible dans le monde entier est une mauvaise sécurité.

chmod -R 755 app/storage fonctionne et est plus sûr.

Ryan
la source
1
Ouais, vous avez raison; c'est une mauvaise idée. Je mettrai à jour ma réponse. Les gens pourraient également bénéficier de stackoverflow.com/a/11996645/470749
Ryan
1
Vous pouvez également avoir la possibilité de changer le groupe de dossiers en groupe nginx, c'est- www-dataà- dire sur Debian. Ensuite, définissez des autorisations encore plus strictes sur le dossier comme: chmod -R 640 app/storagealors chown -R :www-data app/storage. De cette façon, les fichiers ne sont visibles que par le propriétaire de l'application et le serveur Web. Et personne du tout ne peut exécuter directement les fichiers stockés (éventuellement téléchargés). Nginx ne devrait avoir besoin que d'une autorisation de lecture pour accéder aux fichiers.
compliste
3
Note à moi: Je viens de recevoir ce Nginx 403 encore et encore une fois le problème était que j'avais accidentellement laissé hors public/de root /usr/share/nginx/mysitename/public/;. Après avoir ajouté public/et exécuté service nginx restart, cela a fonctionné.
Ryan
qu'en est-il des fenêtres?
Himanshu Bansal
58

Si vous essayez simplement de lister le contenu du répertoire, utilisez autoindex on;comme:

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
la source
9
Je ne veux certainement pas autoindex on; ce serait une mauvaise idée d'exposer le contenu de mon répertoire au public.
Ryan
5
@Ryan Cela revient toujours à "Que veux-tu faire?"
Bhargav Nanekalva
13
Il est assez clair qu'il veut supprimer les erreurs 403 et faire en sorte que les pages Web ne montrent pas tout le contenu du répertoire (en particulier compte tenu de la discussion ci-dessus)
jpmorris
21

J'ai rencontré une erreur similaire
--- "403 Forbidden" dans la page Web
--- "13: Permission refusée" dans le journal des erreurs à /var/log/nginx/error.log

Ci-dessous 3 étapes ont fonctionné pour moi:

1: Terminal ouvert, vu quelque chose comme ci-dessous

user1@comp1:/home/www/

Donc, mon nom d'utilisateur est "user1" (ci-dessus)

2: utilisateur changé dans /etc/nginx/nginx.conf

# user www-data;
user user1;

3: rechargement du nginx

sudo nginx -s reload  

De plus, j'ai appliqué les autorisations de fichier / dossier (avant de faire ci-dessus 3 étapes)
(755 dans mon répertoire, disons / dir1 /) & (644 pour les fichiers sous ce répertoire):
(Je ne suis pas sûr, si cette étape supplémentaire est vraiment requis, un peu plus de 3 étapes pourraient suffire):

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

J'espère que cela aide quelqu'un rapide. Bonne chance.

Manohar Reddy Poreddy
la source
1
Merci mon frère, j'ai eu le même problème, et c'était à cause des autorisations. J'ai défini les autorisations de dossier et de fichier, et maintenant cela fonctionne correctement.
Altaf Hussain
2
Heureux d'entendre que je suis utile. (Aidez les autres, dans votre domaine connu, pendant votre temps libre, si possible, sans rien attendre en retour)
Manohar Reddy Poreddy
Heureux de l'entendre aidé.
Manohar Reddy Poreddy
10

En fait, vous devez vérifier plusieurs choses. 1. vérifier l'état de fonctionnement de votre nginx

ps -ef|grep nginx

ps aux|grep nginx|grep -v grep

Ici, nous devons vérifier qui exécute nginx. souvenez-vous de l'utilisateur et du groupe

  1. vérifier l'état d'accès au dossier

    ls -alt

  2. comparer avec le statut du dossier avec celui de nginx

(1) si l'état d'accès au dossier n'est pas correct

sudo chmod 755 /your_folder_path

(2) si l'utilisateur et le groupe du dossier ne sont pas les mêmes que ceux de nginx en cours d'exécution

sudo chown your_user_name:your_group_name /your_folder_path

et changer le nom d'utilisateur et le groupe de nginx

nginx -h

pour trouver où se trouve le fichier de configuration 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

Parce que l'utilisateur de l'exécution par défaut de nginx n'est personne et que le groupe n'est personne. si nous n'avons pas remarqué cet utilisateur et ce groupe, 403 seront introduits.

Haimei
la source
8

J'ai eu le même problème, le fichier journal m'a montré cette erreur:

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"

J'héberge une application PHP avec le framework codeignitor. Lorsque je voulais voir les fichiers téléchargés, j'ai reçu un fichier 403 Error.

Le problème était que le nginx.conf n'était pas correctement défini. Au lieu de

index index.html index.htm index.php

j'ai seulement inclus

index index.php

J'ai un index.php dans ma racine et j'ai pensé que c'était suffisant, j'avais tort;) L'indice m'a donné NginxLibrary

le vagabond
la source
Merci mec .. J'étais avec le même bateau .. J'ai passé des heures à comprendre pourquoi mon wordpress ne fonctionne pas du tout! La directive index est nécessaire dans la configuration principale de nginx pour que mon installation wordpress fonctionne include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; index index.html index.htm index.php;
mboy
6

Vous pourriez l'obtenir à cause de la politique de Nginx (par exemple "refuser"), ou vous pourriez l'obtenir à cause d'une mauvaise configuration de Nginx, ou vous pourriez l'obtenir à cause des restrictions du système de fichiers.

Vous pouvez déterminer si c'est le plus tard (et éventuellement voir la preuve d'une mauvaise configuration en utilisant strace (sauf que l'OP n'y aura pas accès):

# 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

Ici, j'inspecte l'activité du système de fichiers effectuée par nginx lors d'un test (j'ai eu la même erreur que vous).

Voici une partie sélectionnée de ma configuration à l'époque

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

Dans mon cas, comme le montre assez clairement strace, la jonction de dans le "alias" à "l'index" n'était pas ce à quoi je m'attendais, et il semble que je doive prendre l'habitude de toujours ajouter des noms de répertoire avec un /, donc dans mon cas, ce qui suit a fonctionné:

    location /kibana/3/ {
        alias /var/www/html/kibana/;
        index index.html;
    }
Cameron Kerr
la source
Merci pour cela. Je savais que je n'avais pas de problème d'autorisations et votre commentaire m'a aidé à trouver la solution. J'ai ajouté un "/" à la fin de mon alias et cela fonctionne très bien.
kzahel
vous êtes mon héros @Cameron Kerr, basé sur mon expérience, le problème est nginx lever 403 pour les fichiers non trouvés sur le répertoire alias, par exemple /home/web/public. Pourquoi nginx essaie d'accéder à ces fichiers non trouvés, c'est parce que j'ai oublié de supprimer cette ligne index index.html index.htm index.nginx-debian.html;car ces fichiers ne se trouvent pas dans mon répertoire public.
Agung Prasetyo
4

Cela ressemble à un problème d'autorisations.

Essayez de définir toutes les autorisations comme vous l'avez fait dans mysite1 sur les autres sites.

Par défaut, les autorisations de fichier doivent être 644 et dirs 755. Vérifiez également si l'utilisateur qui exécute nginx a l'autorisation de lire ces fichiers et ces répertoires.

Tomahock
la source
3

changez le try_filespour pointer vers le index.phpchemin, dans le "Laravel" que vous avez mentionné, cela devrait être quelque chose comme ça

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

Et dans le projet "codeigniter", essayez-le comme ceci

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

Parce que vous utilisez php-fpm, vous devez vous assurer que l' php-fpmutilisateur est le même que l' nginxutilisateur.

Vérifiez /etc/php-fpm.d/www.confet définissez l'utilisateur et le groupe php sur nginxsi ce n'est pas le cas.

L' php-fpmutilisateur a besoin d'une autorisation d'écriture.

Ali Hashemi
la source
2

Vous avez besoin d'une autorisation d'exécution sur votre répertoire de fichiers statiques. Ils doivent également être chown'ed par votre utilisateur et groupe nginx.

Rhys
la source
1
Je pense qu'il a seulement besoin d'une autorisation de lecture pour le processus nginx?
compliste
2
location ~* \.php$ {
    ...
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;    
}

Changer la valeur par défaut

fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

à

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

résolu mon problème.

wave_1102
la source
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"    

J'utilisais Ubuntu 15.10 et j'ai rencontré l'erreur 403 Forbidden pour une raison simple. Dans le nginx.conf (fichier de configuration pour nginx), l'utilisateur était «www-data». Une fois que j'ai changé le nom d'utilisateur en [mon nom d'utilisateur], cela a bien fonctionné en supposant que les autorisations nécessaires étaient données à mon nom d'utilisateur. Étapes suivies par moi:

chmod 755 /path/to/your/app    

Mon fichier de configuration ressemble à ceci:

**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
la source
1

Pour moi, le problème était que toutes les routes autres que la route de base fonctionnaient, l'ajout de cette ligne a résolu mon problème:

index           index.php;

Chose complète:

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;
    }
}
des zéros et des uns
la source
1

Pour résoudre ce problème, j'ai passé une nuit complète. Voici mes deux cents sur cette histoire,

Vérifiez si vous utilisez hhvm comme interpréteur php. Ensuite, il est possible qu'il écoute sur le port 9000, vous devrez donc modifier la configuration de votre serveur Web.

Ceci est une note secondaire: si vous utilisez mysql et que les connexions de hhvm à mysql deviennent impossibles, vérifiez si vous avez installé apparmor . le désactiver.

user9869932
la source
0

J'ai résolu mon problème, si je configure comme suit:

location = /login {
    index  login2.html;
}

Cela montrera l'erreur 403.

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

J'ai essayé autoindex on, mais je ne travaille pas. Si je change ma configuration comme ça, cela fonctionne.

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

Je pense que la correspondance exacte, si c'est un chemin devrait être un répertoire.

robin ong
la source
0

lorsque vous souhaitez conserver l'option de répertoire, vous pouvez placer l'index.php avant $ uri comme ceci.

try_files /index.php $uri $uri/
xoyabc
la source