web-dev-qa-db-fra.com

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

J'ai 3 noms de domaine et j'essaie d'héberger les 3 sites sur un serveur (un droplet Digital Ocean) à l'aide de Nginx.

mysite1.namemysite2.namemysite3.name

Un seul d'entre eux fonctionne. Les deux autres résultent en 403 erreurs (de la même manière).

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

La configuration compatible avec mes 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 se trouvent dans des dossiers tels que /usr/share/nginx/monsite1.name/someFolder, puis /usr/share/nginx/monsite1.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 pourrait être faux?

133
Ryan

Voici la configuration 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, le seul résultat dans le navigateur était une erreur de Laravel: "Oups, on dirait que quelque chose s'est mal passé."

Ne PAS exécuter chmod -R 777 app/storage ( note ). Rendre quelque chose de mondial en écriture est une mauvaise sécurité.

chmod -R 755 app/storage fonctionne et est plus sécurisé.

58
Ryan

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

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

Supprimez-le et cela devrait fonctionner:

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

D'après ce que je peux voir, cela est dû au fait que nginx essaiera d'indexer le répertoire et sera bloqué par lui-même. Lancer l'erreur mentionnée par OP.

100
JCM

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

location /somedir {
       autoindex on;
}
50
maz

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

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

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

user1@comp1:/home/www/

Donc, mon nom d'utilisateur est "utilisateur1" (d'en haut)

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

# user www-data;
user user1;

3: Rechargé le nginx

Sudo nginx -s reload  

De plus, j'ai appliqué les autorisations de fichiers/dossiers (avant les 3 étapes précédentes)
(755 dans mon répertoire, dites/dir1 /) & (644 pour les fichiers de ce répertoire):
(Je ne sais pas si cette étape supplémentaire est vraiment nécessaire, juste au-dessus de 3 étapes pourrait suffire):

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

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

18

J'ai eu le même problème, le fichier de log 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 un framework de codeignitor. Quand je voulais voir les fichiers téléchargés, j'ai reçu un 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 je pensais que c'était suffisant, je me suis trompé;) L'indice m'a donné NginxLibrary

7
theDrifter

En fait, il y a plusieurs choses à vérifier. 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. s'il vous plaît rappelez-vous l'utilisateur et le groupe

  1. vérifier le statut d'accès du 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 en cours d'exécution de nginx

Sudo chown your_user_name:your_group_name /your_folder_path

et changer le nom d'utilisateur et le groupe en cours d'exécution de nginx

nginx -h

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 nginx default running n'est ni personne ni groupe. si nous n'avons pas remarqué cet utilisateur et ce groupe, 403 seront introduits. 

6
Haimei

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

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

Vous pouvez l'obtenir à cause de la politique de Nginx (par exemple, "refuser") ou à cause d'une mauvaise configuration de Nginx ou à cause de 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 le PO n'aura pas accès à cela):

# 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 pendant l'exécution d'un test (j'avais la même erreur que vous).

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

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

Dans mon cas, comme strace le montre bien, la fusion de "l'alias" avec "l'index" n'était pas ce à quoi je m'attendais et il me semble que je dois 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;
    }
6
Cameron Kerr

Cela ressemble à un problème d'autorisations.

Essayez de définir toutes les permissions comme vous l'avez fait dans mysite1 sur le site des autres.

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

3
Tomahock

Puisque vous utilisez php-fpm, vous devez vous assurer que php-fpm utilisateur est identique à nginx utilisateur.

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

L'utilisateur php-fpm a besoin d'une autorisation en écriture.

3
Ali Hashemi
location ~* \.php$ {
    ...
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;    
}

Changer 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.

2
wave_1102

changez le try_files pour qu'il pointe vers le chemin index.php, dans le "Laravel" que vous avez mentionné, cela devrait ressembler à ceci

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

Et dans le projet "codeigniter" essayez-le comme ça

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

Vous devez disposer d'une autorisation d'exécution sur votre répertoire de fichiers statiques. Ils doivent également être choqués par votre utilisateur et votre groupe nginx.

2
Rhys
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 fichier nginx.conf (fichier de configuration pour nginx), l'utilisateur s'appelait «www-data» . [mon nom d'utilisateur], cela a bien fonctionné en supposant que les autorisations nécessaires ont été attribué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;
    }
}
}
1
Raunaq Kochar

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 complémentaire: Si vous utilisez mysql et que les connexions de hhvm à mysql deviennent impossibles, vérifiez si vous avez installé apparmor. le désactiver.

0
user9869932

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, ça marche.

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

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

0
robin ong

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

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

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;

Plein chose:

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;
    }
}
0
zeros-and-ones
location / {
root  fileLocation;
index  index.html index.htm;
expires 0;
if_modified_since off;}

Ici, j'ai utilisé alias au lieu de root et c'est ce qui m'a causé l'erreur. Cette configuration fonctionne bien.

0
Credoz