Error de Nginx 403: el índice de directorio de [carpeta] está prohibido

183

Tengo 3 nombres de dominio y estoy tratando de alojar los 3 sitios en un servidor (una gota Digital Ocean) usando Nginx.

mysite1.name mysite2.name mysite3.name

Solo 1 de ellos funciona. Los otros dos resultan en 403 errores (de la misma manera).

En mi registro de errores nginx, veo: [error] 13108#0: *1 directory index of "/usr/share/nginx/mysite2.name/live/" is forbidden.

Mi configuración habilitada para sitios es:

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

Los 3 sitios tienen archivos de configuración casi idénticos.

Los archivos de cada sitio están en carpetas como /usr/share/nginx/mysite1.name/someFolder, y luego /usr/share/nginx/mysite1.name/live es un enlace simbólico a eso. (Lo mismo para mysite2 y mysite3.)

He mirado Nginx 403 prohibido para todos los archivos, pero eso no ayudó.

¿Alguna idea sobre lo que podría estar mal?

Ryan
fuente
24
Creo que le index.html index.phpfaltan archivos, ¿se aseguró de que existan en esa carpeta?
Mohammad AbuShady
Oh tienes razon; los 2 sitios que no funcionan son un proyecto Laravel (que tiene index.php en una subcarpeta / public) y un antiguo proyecto CodeIgniter (que tiene index.php en una subcarpeta / public_web). Pero no estoy seguro de cómo cambiar mi configuración para que los sitios funcionen.
Ryan
Justo como dijo @MohammadAbuShady, no tenía un archivo de índice en la carpeta y recibí este error.
ajon
Acabo de recibir este error nuevamente, pero esta vez el problema fue que accidentalmente configuré el rooten /Users/myUsername/code/applugar de /Users/myUsername/code/app/public.
Ryan
Esto es cuando brillan los administradores del servidor. detalles
OldFart

Respuestas:

171

Si tiene la indexación de directorio desactivada y tiene este problema, probablemente se deba a que try_files que está utilizando tiene una opción de directorio:

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

Elimínalo y debería funcionar:

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

Por que sucede esto

TL; DR: Esto se debe a que nginx intentará indexar el directorio y se bloqueará solo. Lanzando el error mencionado por OP.

try_files $uri $uri/significa que, desde el directorio raíz, intente el archivo señalado por el uri, si eso no existe, intente con un directorio (de ahí el /). Cuando nginx accede a un directorio, intenta indexarlo y devolver la lista de archivos dentro del navegador / cliente, sin embargo, de forma predeterminada, la indexación del directorio está deshabilitada, por lo que devuelve el error "Error Nginx 403: índice del directorio de [carpeta] está prohibido".

La indexación de directorios está controlada por la autoindexopción: https://nginx.org/en/docs/http/ngx_http_autoindex_module.html

JCM
fuente
Este es exactamente el problema que estaba teniendo. No podía entender por qué try_filesno estaba intentando index.php, seguí obteniendo 403 con "el índice de directorio de ... está prohibido"
Travis D
44
@JCM, ¿te importaría agregar una explicación de por qué tener $uri/crea un problema?
Ian Dunn el
La mía resuelta también
alariva
1
Yo tenía el mismo error. Tenía 2 sitios, ambos en un subdominio. Quitar el $ uri / hizo el truco. ¡Gracias!
jivanrij
55
@luminol try_files $uri $uri/significa, desde la raíz web, pruebe el archivo señalado por la uri, si eso no existe, intente con un directorio (de ahí el /). Cuando nginx accede a un directorio, intenta indexarlo y devolver la lista de archivos dentro del navegador / cliente, sin embargo, de forma predeterminada, la indexación del directorio está deshabilitada, por lo que devuelve el error "Error Nginx 403: índice del directorio de [carpeta] está prohibido". La indexación de directorios está controlada por la autoindexopción: nginx.org/en/docs/http/ngx_http_autoindex_module.html
JCM
67

Aquí está la configuración que funciona:

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

}

Entonces, el único resultado en el navegador fue un error de Laravel: "Vaya, parece que algo salió mal".

NO corras chmod -R 777 app/storage( nota ). Hacer algo que se pueda escribir en el mundo es una mala seguridad.

chmod -R 755 app/storage Funciona y es más seguro.

Ryan
fuente
1
Si, teneis razón; Esa es una mala idea. Actualizaré mi respuesta. La gente también podría beneficiarse de stackoverflow.com/a/11996645/470749
Ryan
1
También puede tener la opción de cambiar el grupo de carpetas al grupo nginx, es decir, www-dataen debian. Luego, establezca permisos aún más estrictos en la carpeta como: chmod -R 640 app/storageentonces chown -R :www-data app/storage. De esta forma, los archivos solo son visibles para el propietario de la aplicación y el servidor web. Y nadie puede ejecutar ninguno de los archivos almacenados (posiblemente cargados) directamente. Nginx solo debería necesitar permiso de lectura para acceder a los archivos.
2014
3
Nota para mí: acabo de recibir este Nginx 403 una y otra vez, el problema fue que accidentalmente lo dejé public/encendido root /usr/share/nginx/mysitename/public/;. Después de agregar public/y ejecutar service nginx restart, funcionó.
Ryan
¿Qué hay de las ventanas?
Himanshu Bansal
58

Si simplemente está tratando de enumerar el contenido del directorio, use autoindex on;como:

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
fuente
9
Definitivamente no quiero autoindex on; sería una mala idea exponer el contenido de mi directorio al público.
Ryan
55
@Ryan Siempre se reduce a "¿Qué quieres hacer?"
Bhargav Nanekalva
13
Está bastante claro que quiere eliminar 403 errores y hacer que las páginas web muestren que no muestran todo el contenido del directorio (especialmente dada la discusión anterior)
jpmorris
21

Encontré un error similar
--- "403 Prohibido" en la página web
--- "13: Permiso denegado" en el registro de errores en /var/log/nginx/error.log

A continuación 3 pasos me funcionaron:

1: Abra la Terminal, vi algo como abajo

user1@comp1:/home/www/

Entonces, mi nombre de usuario es "usuario1" (desde arriba)

2: Usuario cambiado en /etc/nginx/nginx.conf

# user www-data;
user user1;

3: Recargó el nginx

sudo nginx -s reload  

Además, he aplicado permisos de archivo / carpeta (antes de hacer los 3 pasos anteriores)
(755 a mi directorio, por ejemplo / dir1 /) y (644 para archivos en ese directorio):
(No estoy seguro, si este paso adicional es realmente requerido, un poco más de 3 pasos pueden ser suficientes):

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

Espero que esto ayude a alguien rápido. La mejor de las suertes.

Manohar Reddy Poreddy
fuente
1
Gracias hermano, tuve el mismo problema, y ​​fue por los permisos. Configuré permisos de carpeta y archivo, y ahora funciona bien.
Altaf Hussain
2
Me alegra saber que soy útil. (Ayude a otros, en su dominio conocido, en su tiempo libre, si es posible, sin esperar nada)
Manohar Reddy Poreddy
Me alegra saber que ayudó.
Manohar Reddy Poreddy
10

De hecho, hay varias cosas que debe verificar. 1. verifique el estado de ejecución de su nginx

ps -ef|grep nginx

ps aux|grep nginx|grep -v grep

Aquí tenemos que verificar quién está ejecutando nginx. por favor recuerde el usuario y el grupo

  1. verificar el estado de acceso de la carpeta

    ls -alt

  2. comparar con el estado de la carpeta con el de nginx

(1) si el estado de acceso de la carpeta no es correcto

sudo chmod 755 /your_folder_path

(2) si el usuario y el grupo de la carpeta no son los mismos que los de nginx

sudo chown your_user_name:your_group_name /your_folder_path

y cambiar el nombre de usuario y el grupo en ejecución de nginx

nginx -h

para encontrar dónde está el archivo de configuración 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

Porque el usuario de nginx default running es nadie y el grupo no es nadie. Si no hemos notado a este usuario y grupo, se introducirá 403.

Haimei
fuente
8

Tuve el mismo problema, el archivo de registro me mostró este error:

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"

Estoy alojando una aplicación PHP con framework codeignitor. Cuando quería ver los archivos cargados, recibí un403 Error .

El problema era que nginx.conf no estaba correctamente definido. En vez de

index index.html index.htm index.php

solo incluí

index index.php

Tengo un index.php en mi raíz y pensé que era suficiente, estaba equivocado;) La pista me dio NginxLibrary

el vagabundo
fuente
Gracias a Dios ... estaba en el mismo barco ... ¡Pasé horas descubriendo por qué mi wordpress no funciona en absoluto! La directiva index es necesaria en la configuración principal de nginx para que mi instalación de wordpress funcione include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; index index.html index.htm index.php;
mboy
6

Puede obtener esto debido a la política de Nginx (por ejemplo, "negar"), o puede obtener esto debido a una configuración incorrecta de Nginx, o puede obtener esto debido a restricciones del sistema de archivos.

Puede determinar si es más tarde (y posiblemente ver evidencia de una configuración incorrecta utilizando strace (excepto, el OP no tendrá acceso a eso):

# 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

Aquí estoy inspeccionando la actividad del sistema de archivos realizada por nginx mientras ejecutaba una prueba (tuve el mismo error que usted).

Aquí hay una parte seleccionada de mi configuración en el momento

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

En mi caso, como muestra claramente Strace, la unión de "alias" al "índice" no era lo que esperaba, y parece que necesito acostumbrarme a agregar siempre nombres de directorio con un /, así que en mi caso, funcionó lo siguiente:

    location /kibana/3/ {
        alias /var/www/html/kibana/;
        index index.html;
    }
Cameron Kerr
fuente
Gracias por esto. Sabía que no tenía un problema de permisos y su comentario me ayudó a encontrar la solución. Agregué un "/" al final de mi alias y funciona bien.
kzahel el
eres mi héroe @Cameron Kerr, según mi experiencia, el problema es nginx raise 403 para archivos no encontrados en el directorio de alias, por ejemplo /home/web/public. Por qué nginx intenta acceder a estos archivos no encontrados es porque olvidé eliminar esta línea index index.html index.htm index.nginx-debian.html;ya que esos archivos no están dentro de mi directorio público.
Agung Prasetyo
4

Parece un problema de permisos.

Intente establecer todos los permisos como lo hizo en mysite1 para el sitio de otros.

De manera predeterminada, los permisos de los archivos deben ser 644 y los directorios 755. Compruebe también si el usuario que ejecuta nginx tiene permiso para leer esos archivos y directorios.

Tomahock
fuente
3

cambia el try_filespunto para apuntar a la index.phpruta, en el "Laravel" que mencionaste debería ser algo como esto

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

Y en el proyecto "codeigniter" pruébalo así

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

Debido a que está utilizando php-fpm, debe asegurarse de que el php-fpmusuario sea el mismo que el nginxusuario.

Verifique /etc/php-fpm.d/www.confy establezca php user and group en nginxsi no es así.

El php-fpmusuario necesita permiso de escritura.

Ali Hashemi
fuente
2

Necesita ejecutar permiso en su directorio de archivos estáticos. También deben ser identificados por su usuario y grupo de nginx.

Rhys
fuente
1
¿Creo que solo necesita permiso de lectura para el proceso nginx?
2014
2
location ~* \.php$ {
    ...
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;    
}

Cambiar predeterminado

fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

a

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

resuelto mi problema

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

Estaba ejecutando Ubuntu 15.10 y encontré el error 403 prohibido debido a una simple razón. En el nginx.conf (archivo de configuración para nginx), el usuario era 'www-data'. Una vez que cambié el nombre de usuario a [mi nombre de usuario], funcionó bien asumiendo que se le dieron los permisos necesarios a mi nombre de usuario. Pasos seguidos por mí:

chmod 755 /path/to/your/app    

Mi archivo de configuración se ve así:

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

Para mí, el problema era que cualquier otra ruta que no fuera la ruta base funcionaba, agregar esta línea solucionó mi 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;
    }
}
ceros y unos
fuente
1

Para solucionar este problema, pasé una noche completa. Aquí están mis dos centavos en esta historia,

Compruebe si está utilizando hhvm como intérprete de php. Entonces es posible que esté escuchando en el puerto 9000, por lo que tendrá que modificar la configuración de su servidor web.

Esta es una nota al margen: si está usando mysql, y las conexiones de hhvm a mysql se vuelven imposibles, verifique si tiene instalado un dispositivo . deshabilitarlo

usuario9869932
fuente
0

Resolví mi problema, si configuro como sigue:

location = /login {
    index  login2.html;
}

Mostrará el error 403.

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

Lo intenté autoindex on, pero no funcionó. Si cambio mi configuración de esta manera, funciona.

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

Creo que la coincidencia exacta, si es una ruta, debería ser un directorio.

robin ong
fuente
0

cuando desee mantener la opción de directorio, puede colocar el index.php delante de $ uri de esta manera.

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