Błąd Nginx 403: indeks katalogu [folder] jest zabroniony

183

Mam 3 nazwy domen i próbuję hostować wszystkie 3 witryny na jednym serwerze (kropla Digital Ocean) przy użyciu Nginx.

mysite1.name mysite2.name mysite3.name

Tylko 1 z nich działa. Pozostałe dwa powodują błędy 403 (w ten sam sposób).

Nginx w moim dzienniku błędów, widzę: [error] 13108#0: *1 directory index of "/usr/share/nginx/mysite2.name/live/" is forbidden.

Moja konfiguracja obsługująca witryny to:

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

Wszystkie 3 witryny mają prawie identyczne pliki konfiguracyjne.

Pliki każdej witryny znajdują się w folderach takich jak /usr/share/nginx/mysite1.name/someFolder, a następnie /usr/share/nginx/mysite1.name/live to symlink do tego. (To samo dla mysite2 i mysite3.)

Patrzyłem na Nginx 403 zabroniony dla wszystkich plików, ale to nie pomogło.

Wszelkie pomysły na to, co może być nie tak?

Ryan
źródło
24
myślę, że index.html index.phpbrakuje Ci plików, czy upewniłeś się, że istnieją w tym folderze?
Mohammad AbuShady
Och, masz rację; 2 strony, które nie działają, to projekt Laravel (który ma index.php w podfolderze / public) i stary projekt CodeIgniter (który ma index.php w podfolderze / public_web). Ale nie jestem pewien, jak zmienić konfigurację, aby witryny działały.
Ryan,
Tak jak powiedział @MohammadAbuShady, nie miałem pliku indeksu w folderze i dostałem ten błąd.
ajon
Właśnie dostałem ten błąd, ale tym razem problem polegał na tym, że przypadkowo ustawiłem go rootna /Users/myUsername/code/appzamiast /Users/myUsername/code/app/public.
Ryan
To jest, kiedy administratorzy serwera świecą. szczegóły
OldFart

Odpowiedzi:

171

Jeśli masz wyłączone indeksowanie katalogów i masz ten problem, to prawdopodobnie dlatego, że używane pliki try_ mają opcję katalogu:

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

Usuń go i powinno działać:

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

Dlaczego tak się dzieje

TL; DR: Jest to spowodowane tym, że nginx spróbuje zaindeksować katalog i sam zostanie zablokowany. Zgłoszenie błędu wspomnianego przez OP.

try_files $uri $uri/oznacza, że ​​z katalogu głównego wypróbuj plik wskazany przez uri, jeśli nie istnieje, spróbuj zamiast tego katalogu (stąd /). Gdy nginx uzyskuje dostęp do katalogu, próbuje go zindeksować i zwrócić listę plików w nim do przeglądarki / klienta, jednak domyślnie indeksowanie katalogu jest wyłączone, więc zwraca błąd „Błąd Nginx 403: indeks katalogu [folder] jest zabronione".

Indeksowanie katalogów jest kontrolowane przez autoindexopcję: https://nginx.org/en/docs/http/ngx_http_autoindex_module.html

JCM
źródło
To właśnie miałem problem. Nie mogłem zrozumieć, dlaczego try_filesnie próbowałem index.php, po prostu ciągle otrzymywałem 403 z „indeksem katalogu ... jest zabronione”
Travis D
4
@JCM, czy mogłabyś dodając wyjaśnienie dlaczego mając $uri/stwarza problem?
Ian Dunn
Moja
1
Miałem ten sam błąd. Miałem 2 witryny, obie w subdomenie. Usunięcie $ uri / zrobiło lewę. Dzięki!
jivanrij
5
@luminol try_files $uri $uri/oznacza, z katalogu głównego, wypróbowanie pliku wskazanego przez URI, jeśli to nie istnieje, spróbuj zamiast tego katalogu (stąd /). Gdy nginx uzyskuje dostęp do katalogu, próbuje go zindeksować i zwrócić listę plików w nim do przeglądarki / klienta, jednak domyślnie indeksowanie katalogu jest wyłączone, więc zwraca błąd „Błąd Nginx 403: indeks katalogu [folder] jest zabronione". Indeksowanie katalogów jest kontrolowane przez autoindexopcję: nginx.org/en/docs/http/ngx_http_autoindex_module.html
JCM
67

Oto konfiguracja, która działa:

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

}

Wtedy jedynym wyjściem w przeglądarce był błąd Laravela: „Ups, wygląda na to, że coś poszło nie tak”.

NIE uruchamiaj chmod -R 777 app/storage( uwaga ). Robienie czegoś, co można zapisać na całym świecie, jest złym zabezpieczeniem.

chmod -R 755 app/storage działa i jest bardziej bezpieczny.

Ryan
źródło
1
Tak, macie rację; to zły pomysł. Zaktualizuję moją odpowiedź. Ludzie mogą również skorzystać z stackoverflow.com/a/11996645/470749
Ryan
1
Możesz także mieć możliwość zmiany grupy folderów na grupę nginx, tj. www-dataNa Debianie. Następnie ustaw jeszcze bardziej rygorystyczne uprawnienia do folderu, takie jak: chmod -R 640 app/storagenastępnie chown -R :www-data app/storage. W ten sposób pliki są widoczne tylko dla właściciela aplikacji i serwera WWW. I nikt nie może bezpośrednio wykonać żadnego z zapisanych (prawdopodobnie przesłanych) plików. Nginx powinien mieć tylko uprawnienia do odczytu, aby uzyskać dostęp do plików.
komplementuje
3
Uwaga do siebie: Właśnie ten Nginx 403 znowu i znowu problem było to, że przypadkowo przerwane public/na root /usr/share/nginx/mysitename/public/;. Po dodaniu public/i uruchomieniu service nginx restartdziałało.
Ryan
co z oknami?
Himanshu Bansal
58

Jeśli po prostu próbujesz wyświetlić zawartość katalogu, użyj autoindex on;:

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
źródło
9
Zdecydowanie nie chcę autoindex on; kiepskim pomysłem byłoby ujawnienie mojej zawartości katalogu publicznie.
Ryan
5
@ Ryan Zawsze sprowadza się do „Co chcesz robić?”
Bhargav Nanekalva,
13
Jest całkiem jasne, że chce usunąć błędy 403 i wyświetlać strony internetowe, aby nie wyświetlały całej zawartości katalogu (zwłaszcza biorąc pod uwagę powyższą dyskusję)
jpmorris
21

Na
stronie internetowej wystąpił podobny błąd --- „403 Forbidden”
--- „13: Odmowa uprawnień” w dzienniku błędów na stronie /var/log/nginx/error.log

Poniżej 3 kroki działały dla mnie:

1: Otwórz terminal, zobaczyłem coś jak poniżej

user1@comp1:/home/www/

Moja nazwa użytkownika to „użytkownik1” (z góry)

2: Zmieniono użytkownika w /etc/nginx/nginx.conf

# user www-data;
user user1;

3: Załadowano ponownie nginx

sudo nginx -s reload  

Dodatkowo zastosowałem uprawnienia do plików / folderów (zanim zrobiłem powyżej 3 kroków)
(755 do mojego katalogu, powiedz / dir1 /) i (644 dla plików w tym katalogu):
(Nie jestem pewien, czy ten dodatkowy krok jest naprawdę wymagane, nieco powyżej 3 kroków może wystarczyć):

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

Mam nadzieję, że to pomoże komuś szybko. Powodzenia.

Manohar Reddy Poreddy
źródło
1
Dzięki stary, miałem ten sam problem i to z powodu uprawnień. Ustawiam uprawnienia do folderów i plików, a teraz działa dobrze.
Altaf Hussain,
2
Cieszę się, że jestem pomocny. (Pomóż innym, w znanej domenie, w wolnym czasie, jeśli to możliwe, nie oczekując niczego w zamian)
Manohar Reddy Poreddy
Cieszę się, że to pomogło.
Manohar Reddy Poreddy
10

W rzeczywistości jest kilka rzeczy, które musisz sprawdzić. 1. sprawdź status działania twojego nginx

ps -ef|grep nginx

ps aux|grep nginx|grep -v grep

Tutaj musimy sprawdzić, kto obsługuje nginx. pamiętaj o użytkowniku i grupie

  1. sprawdź status dostępu do folderu

    ls -alt

  2. porównaj ze statusem folderu ze statusem nginx

(1) jeśli status dostępu do folderu jest nieprawidłowy

sudo chmod 755 /your_folder_path

(2) jeśli użytkownik i grupa folderu nie są takie same jak działające nginx

sudo chown your_user_name:your_group_name /your_folder_path

i zmień działającą nazwę użytkownika i grupę nginx

nginx -h

znaleźć plik konfiguracyjny 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

Ponieważ domyślnym użytkownikiem nginx jest użytkownik, a grupa to nikt. jeśli nie zauważymy tego użytkownika i grupy, zostanie wprowadzonych 403.

Haimei
źródło
8

Miałem ten sam problem, plik dziennika pokazał mi ten błąd:

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"

Hostuję aplikację PHP z frameworkiem Codeignitor. Kiedy chciałem wyświetlić przesłane pliki, otrzymałem 403 Error.

Problem polegał na tym, że nginx.conf nie został poprawnie zdefiniowany. Zamiast

index index.html index.htm index.php

tylko zawarłem

index index.php

Mam plik index.php w katalogu głównym i myślałem, że to wystarczy, myliłem się;) Podpowiedź dała mi NginxLibrary

theDrifter
źródło
Dzięki stary .. Byłem na tej samej łodzi .. Spędziłem godziny zastanawiając się, dlaczego moje wordpress w ogóle nie działa! Dyrektywa indeksu jest potrzebna w głównej konfiguracji nginx, aby moja instalacja WordPress działała include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; index index.html index.htm index.php;
mboy
6

Możesz dostać to z powodu polityki Nginx (np. „Odmowa”) lub możesz dostać to z powodu błędnej konfiguracji Nginx, lub możesz dostać to z powodu ograniczeń systemu plików.

Możesz ustalić, czy jest to później (i ewentualnie zobaczyć dowody błędnej konfiguracji za pomocą strace (z wyjątkiem, że OP nie będzie miał do tego dostępu):

# 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

Tutaj sprawdzam aktywność systemu plików wykonaną przez nginx podczas uruchomienia testu (miałem taki sam błąd jak ty).

Oto wybrana część mojej konfiguracji w tym czasie

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

W moim przypadku, jak pokazuje dość wyraźnie strace, dołączenie „aliasu” do „indeksu” nie było tym, czego się spodziewałem, i wydaje się, że muszę przyzwyczaić się zawsze dodawać nazwy katalogów za pomocą /, więc w moim przypadku działało:

    location /kibana/3/ {
        alias /var/www/html/kibana/;
        index index.html;
    }
Cameron Kerr
źródło
Dzięki za to. Wiedziałem, że nie mam problemu z uprawnieniami, a twój komentarz pomógł mi znaleźć rozwiązanie. Dodałem „/” na końcu mojego aliasu i działa dobrze.
kzahel
jesteś moim bohaterem @Cameron Kerr, w oparciu o moje doświadczenia problem polega na tym, że Nginx przebił 403 za nie znalezione pliki w katalogu aliasów np /home/web/public. Dlaczego nginx próbuje uzyskać dostęp do tych nie odnalezionych plików, ponieważ zapomniałem usunąć tę linię, index index.html index.htm index.nginx-debian.html;ponieważ tych plików nie ma w moim publicznym katalogu.
Agung Prasetyo,
4

Wygląda to na jakiś problem z uprawnieniami.

Spróbuj ustawić wszystkie uprawnienia, tak jak zrobiłeś to w mysite1, na stronie innych.

Domyślnie uprawnienia do plików powinny wynosić 644, a katalog 755. Sprawdź także, czy użytkownik, który uruchamia nginx, ma uprawnienia do odczytu tych plików i katalogów.

Tomahock
źródło
3

zmień try_filespunkt na index.phpścieżkę, w „Laravel”, o którym wspomniałeś, powinno to być coś takiego

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

I w projekcie „Codeigniter” spróbuj tego w ten sposób

location / {
    try_files $uri $uri/ /public_web/index.php$request_uri;
}
Mohammad AbuShady
źródło
3

Ponieważ używasz php-fpm, upewnij się, że php-fpmużytkownik jest taki sam jak nginxużytkownik.

Sprawdź /etc/php-fpm.d/www.confi ustaw php użytkownika i grupę na, nginxjeśli tak nie jest.

php-fpmUżytkownik potrzebuje uprawnienia.

Ali Hashemi
źródło
2

Potrzebujesz uprawnień do wykonania w katalogu plików statycznych. Muszą być również zaznaczone przez użytkownika i grupę nginx.

Rhys
źródło
1
Myślę, że potrzebuje tylko pozwolenia na odczyt do procesu Nginx?
komplementuje
2
location ~* \.php$ {
    ...
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;    
}

Zmień domyślne

fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

do

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

rozwiązał mój problem.

fala_1102
źródło
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"    

Uruchomiłem Ubuntu 15.10 i napotkałem błąd 403 Forbidden z prostego powodu. W pliku nginx.conf (plik konfiguracyjny dla nginx) użytkownik był „www-data”. Po zmianie nazwy użytkownika na [moja nazwa użytkownika] działało dobrze, zakładając, że otrzymałem niezbędne uprawnienia do mojej nazwy użytkownika. Kroki, które wykonałem:

chmod 755 /path/to/your/app    

Mój plik konfiguracyjny wygląda następująco:

**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
źródło
1

Dla mnie problem polegał na tym, że działały wszystkie trasy inne niż trasa podstawowa, dodanie tej linii naprawiło mój problem:

index           index.php;

Pełna rzecz:

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;
    }
}
zera-i-jedynki
źródło
1

Aby rozwiązać ten problem, spędziłem całą noc. Oto moje dwa centy za tę historię,

Sprawdź, czy używasz hhvm jako interpretera php. Następnie możliwe jest, że nasłuchuje na porcie 9000, więc będziesz musiał zmodyfikować konfigurację serwera WWW.

To jest uwaga dodatkowa: jeśli używasz mysql, a połączenia hhvm z mysql stają się niemożliwe, sprawdź, czy masz zainstalowany apparmor . wyłącz to.

użytkownik9869932
źródło
0

Rozwiązałem problem, jeśli skonfiguruję w następujący sposób:

location = /login {
    index  login2.html;
}

Wyświetli błąd 403.

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

Próbowałem autoindex on, ale nie działa. Jeśli zmienię konfigurację w ten sposób, to zadziała.

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

Myślę, że dokładne dopasowanie, jeśli jest to ścieżka, powinno być katalogiem.

robin ong
źródło
0

jeśli chcesz zachować opcję katalogu, możesz umieścić index.php przed $ uri w ten sposób.

try_files /index.php $uri $uri/
xoyabc
źródło