Erro Nginx 403: o índice de diretório de [pasta] é proibido


183

Eu tenho três nomes de domínio e estou tentando hospedar todos os três sites em um servidor (uma gota do Digital Ocean) usando o Nginx.

mysite1.name mysite2.name mysite3.name

Apenas 1 deles funciona. Os outros dois resultam em erros 403 (da mesma maneira).

Na minha log de erro nginx, eu vejo: [error] 13108#0: *1 directory index of "/usr/share/nginx/mysite2.name/live/" is forbidden.

Minha configuração habilitada para sites é:

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

Todos os 3 sites têm arquivos de configuração quase idênticos.

Os arquivos de cada site estão em pastas como /usr/share/nginx/mysite1.name/someFolder e /usr/share/nginx/mysite1.name/live é um link simbólico para isso. (O mesmo para o meu site2 e o meu site3.)

Eu olhei para o Nginx 403 proibido para todos os arquivos, mas isso não ajudou.

Alguma idéia do que pode estar errado?


24
Eu acho que você tem index.html index.phparquivos ausentes, você se certificou de que eles existem nessa pasta?
Mohammad AbuShady 10/10

Oh você está certo; os 2 sites que não estão funcionando são um projeto Laravel (que possui index.php em uma subpasta / public) e um projeto antigo do CodeIgniter (que possui index.php em uma subpasta / public_web). Mas não tenho certeza de como alterar minha configuração para fazer os sites funcionarem.
Ryan

Assim como o @MohammadAbuShady disse, eu não tinha um arquivo de índice na pasta e obtive esse erro.
#

Acabei de receber esse erro novamente, mas desta vez o problema era que eu acidentalmente defini o rootque estava em /Users/myUsername/code/appvez de /Users/myUsername/code/app/public.
Ryan

É quando os administradores do servidor brilham. detalhes
OldFart 26/01/19

Respostas:


171

Se você tem a indexação de diretório desativada e está tendo esse problema, provavelmente é porque o try_files que você está usando possui uma opção de diretório:

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

Remova-o e deve funcionar:

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

Por que isso acontece

TL; DR: Isso é causado porque o nginx tentará indexar o diretório e será bloqueado por si só. Lançando o erro mencionado pelo OP.

try_files $uri $uri/significa que, no diretório raiz, tente o arquivo apontado pelo uri, se não existir, tente um diretório (daí o /). Quando o nginx acessa um diretório, ele tenta indexá-lo e retornar a lista de arquivos dentro dele para o navegador / cliente; no entanto, a indexação de diretório padrão está desativada e, portanto, retorna o erro "Nginx 403 error: directory index of [folder] é proibido ".

A indexação de diretório é controlada pela autoindexopção: https://nginx.org/en/docs/http/ngx_http_autoindex_module.html


Este é exatamente o problema que eu estava tendo. Eu não conseguia entender por que try_filesnão estava tentando index.php, eu apenas continuei recebendo 403 com "é proibido índice do diretório de ..."
Travis D

4
@JCM, você se importaria em adicionar uma explicação sobre por que $uri/criar um problema?
Ian Dunn

Resolvido a minha também
alariva

1
Eu tive o mesmo erro. Eu tinha 2 sites, ambos em um subdomínio. A remoção do $ uri / fez o truque. Obrigado!
jivanrij

5
@luminol try_files $uri $uri/significa, a partir da raiz da web, tente o arquivo apontado pelo uri; se isso não existir, tente um diretório (por isso, o /). Quando o nginx acessa um diretório, ele tenta indexá-lo e retornar a lista de arquivos dentro dele para o navegador / cliente; no entanto, a indexação de diretório padrão está desativada e, portanto, retorna o erro "Nginx 403 error: directory index of [folder] é proibido ". A indexação de diretório é controlada pela autoindexopção: nginx.org/en/docs/http/ngx_http_autoindex_module.html
JCM

67

Aqui está a configuração 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;
    }

}

Então a única saída no navegador foi um erro do Laravel: "Opa, parece que algo deu errado."

NÃO corra chmod -R 777 app/storage( nota ). Tornar algo gravável no mundo é uma má segurança.

chmod -R 755 app/storage funciona e é mais seguro.


1
Sim, vocês estão certos; isso é uma péssima ideia. Vou atualizar minha resposta. As pessoas também podem se beneficiar do stackoverflow.com/a/11996645/470749
Ryan

1
Você também pode alterar o grupo de pastas para o grupo nginx, ou seja, www-datano debian. Em seguida, defina permissões ainda mais rígidas na pasta, como: chmod -R 640 app/storageentão chown -R :www-data app/storage. Dessa forma, os arquivos são visíveis apenas para o proprietário do aplicativo e o servidor da web. E ninguém pode executar diretamente nenhum dos arquivos armazenados (possivelmente carregados). O Nginx deve precisar apenas de permissão de leitura para acessar os arquivos.
Complistic

3
Nota to self: Eu só tenho este Nginx 403 novamente e novamente o problema era que eu tinha acidentalmente parou public/em root /usr/share/nginx/mysitename/public/;. Depois de adicionar public/e executar service nginx restart, funcionou.
Ryan

e as janelas?
Himanshu Bansal

58

Se você está simplesmente tentando listar o conteúdo do diretório, 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;
        }
}

9
Eu definitivamente não quero autoindex on; seria uma má idéia expor o conteúdo do meu diretório ao público.
Ryan

5
@ Ryan Sempre se resume a "O que você quer fazer?"
Bhargav Nanekalva

13
É bastante claro que ele quer para remover 403 erros e obter páginas para mostrar não exibir todo o conteúdo do diretório (esp dada a discussão acima)
jpmorris

21

Encontrei erro semelhante
--- "403 Proibido" na página da web
--- "13: Permissão negada" no log de erros em /var/log/nginx/error.log

Abaixo 3 etapas trabalhadas para mim:

1: Abra o Terminal, viu algo como abaixo

user1@comp1:/home/www/

Então, meu nome de usuário é "user1" (de cima)

2: Usuário alterado no /etc/nginx/nginx.conf

# user www-data;
user user1;

3: Recarregou o nginx

sudo nginx -s reload  

Além disso, apliquei permissões de arquivo / pasta (antes de executar acima de 3 etapas)
(755 no meu diretório, digamos / dir1 /) & (644 para arquivos nesse diretório):
(não tenho certeza, se esta etapa adicional é realmente necessário, um pouco acima de três etapas pode ser suficiente):

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

Espero que isso ajude alguém rápido. Boa sorte.


1
Obrigado irmão, eu tive o mesmo problema, e foi por causa de permissões. Defino as permissões de pasta e arquivo e agora está funcionando bem.
Altaf Hussain

2
Fico feliz em saber que sou útil. (Ajudar os outros, no seu domínio conhecido, em seu tempo livre, se possível, sem esperar nada de volta)
Manohar Reddy Poreddy

Fico feliz em ouvir isso ajudou.
Manohar Reddy Poreddy

10

De fato, há várias coisas que você precisa verificar. 1. verifique o status de execução do seu nginx

ps -ef|grep nginx

ps aux|grep nginx|grep -v grep

Aqui precisamos verificar quem está executando o nginx. lembre-se do usuário e do grupo

  1. verificar o status de acesso da pasta

    ls -alt

  2. comparar com o status da pasta com os nginx

(1) se o status de acesso da pasta não estiver correto

sudo chmod 755 /your_folder_path

(2) se o usuário e o grupo da pasta não forem os mesmos que os do nginx

sudo chown your_user_name:your_group_name /your_folder_path

e altere o nome de usuário e o grupo em execução do nginx

nginx -h

para descobrir onde está o arquivo de configuração 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

Como o usuário da execução padrão do nginx não é ninguém e o grupo é ninguém. se não notarmos esse usuário e grupo, 403 será apresentado.


8

Eu tive o mesmo problema, o arquivo de log me mostrou este erro:

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"

Estou hospedando um aplicativo PHP com estrutura codeignitor. Quando eu queria visualizar os arquivos enviados, recebi um403 Error .

O problema era que o nginx.conf não estava definido corretamente. Ao invés de

index index.html index.htm index.php

eu apenas incluí

index index.php

Eu tenho um index.php na minha raiz e eu pensei que era o suficiente, eu estava errado;) A dica me deu NginxLibrary


Graças a Deus .. eu estava com o mesmo barco .. Passei horas descobrindo por que meu wordpress não funciona! directiva índice é necessária na configuração principal nginx para minha instalação do WordPress para o trabalho include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; index index.html index.htm index.php;
MBoy

6

Você pode obter isso por causa da política do Nginx (por exemplo, "negar") ou por causa da configuração incorreta do Nginx ou por causa de restrições do sistema de arquivos.

Você pode determinar se é o mais recente (e possivelmente ver evidências de uma configuração incorreta usando strace (exceto, o OP não terá acesso a isso):

# 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

Aqui, estou inspecionando a atividade do sistema de arquivos feita pelo nginx durante a execução de um teste (tive o mesmo erro que você).

Aqui está uma parte selecionada da minha configuração no momento

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

No meu caso, como strace mostra claramente, a junção de no "alias" ao "índice" não era o que eu esperava, e parece que eu preciso adquirir o hábito de sempre acrescentar nomes de diretório com um /, então no meu caso, o seguinte funcionou:

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

Obrigado por isso. Eu sabia que não tinha um problema de permissões e seu comentário me ajudou a encontrar a solução. Eu adicionei um "/" ao final do meu alias e funciona bem.
kzahel

você é meu herói @Cameron Kerr, com base na minha experiência, o problema é nginx raise 403 para arquivos não encontrados no diretório de alias, por exemplo /home/web/public. Por que o nginx tenta acessar esses arquivos não encontrados é porque eu esqueci de remover essa linha, index index.html index.htm index.nginx-debian.html;pois esses arquivos não estão dentro do meu diretório público.
Agung Prasetyo 11/11

4

Parece que há algum problema de permissão.

Tente definir todas as permissões como você fez no meu site1 para o site dos outros.

Por padrão, as permissões de arquivo devem ser 644 e dirs 755. Verifique também se o usuário que executa o nginx tem permissão para ler esses arquivos e dirs.


3

mude try_filespara apontar para o index.phpcaminho, no "Laravel" que você mencionou, deve ser algo como isto

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

E no projeto "codeigniter", tente assim

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

3

Como você está usando php-fpm, verifique se o php-fpmusuário é igual ao nginxusuário.

Verifique /etc/php-fpm.d/www.confe defina usuário e grupo php como nginxse não estiver.

O php-fpmusuário precisa de permissão de gravação.


2

Você precisa executar permissão no diretório de arquivos estáticos. Eles também precisam ser mostrados pelo usuário e grupo do nginx.


1
Eu acho que ele só precisa de permissão de leitura para o processo nginx?
Complistic

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

Alterar padrão

fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

para

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

resolveu meu 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"    

Eu estava executando o Ubuntu 15.10 e encontrou o erro 403 Proibido por um motivo simples. No nginx.conf (arquivo de configuração do nginx), o usuário era 'www-data'. Depois que mudei o nome de usuário para [meu nome de usuário], funcionou bem, assumindo que as permissões necessárias foram dadas ao meu nome de usuário. Passos seguidos por mim:

chmod 755 /path/to/your/app    

Meu arquivo de configuração fica assim:

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

Para mim, o problema era que quaisquer rotas diferentes da rota base estavam funcionando, adicionando esta linha corrigi meu problema:

index           index.php;

Coisa 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

Para corrigir esse problema, passei uma noite inteira. Aqui estão meus dois centavos nesta história,

Verifique se você está usando hhvm como intérprete php. Então é possível que esteja ouvindo na porta 9000, para que você precise modificar a configuração do servidor da web.

Esta é uma observação: Se você estiver usando o mysql, e as conexões do hhvm ao mysql se tornarem impossíveis, verifique se você tem o aparmor instalado. desative-o.


0

Resolvi meu problema, se eu configurar como segue:

location = /login {
    index  login2.html;
}

Ele mostrará o erro 403.

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

Eu tentei autoindex on, mas não estou trabalhando. Se eu mudar o meu configure assim, ele funciona.

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

Eu acho que a correspondência exata, se for um caminho, deve ser um diretório.


0

quando você quiser manter a opção de diretório, você pode colocar o index.php à frente de $ uri assim.

try_files /index.php $uri $uri/
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.