Nginx 403 hatası: [klasör] dizin dizini yasaklandı


183

3 alan adları var ve Nginx kullanarak bir sunucuda (Digital Ocean damlacık) tüm 3 siteyi barındırmaya çalışıyorum.

sitem1.adim sitem2.adim sitem3.adim

Sadece 1 tanesi çalışıyor. Diğer ikisi 403 hatasıyla sonuçlanır (aynı şekilde).

Benim nginx hata günlüğünde, ben bakın: [error] 13108#0: *1 directory index of "/usr/share/nginx/mysite2.name/live/" is forbidden.

Siteleri etkin yapılandırmam:

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

Her 3 sitenin de neredeyse aynı yapılandırma dosyaları vardır.

Her sitenin dosyaları /usr/share/nginx/mysite1.name/someFolder gibi klasörlerde bulunur ve ardından /usr/share/nginx/mysite1.name/live buna bir sembolik bağlantıdır. (Sitem2 ve sitem3 için aynıdır.)

Nginx 403'e tüm dosyalar için yasak baktım ama bu işe yaramadı.

Neyin yanlış olabileceğine dair bir fikrin var mı?


24
sanırım index.html index.phpdosyalarınız eksik, bu klasörde bulunduğundan emin oldunuz mu?
Mohammad AbuShady

Oh haklısın; çalışmayan 2 site bir Laravel projesi (bir / public alt klasöründe index.php olan) ve eski bir CodeIgniter projesi (/ public_web alt klasöründeki index.php olan). Ancak sitelerin çalışmasını sağlamak için yapılandırmamı nasıl değiştireceğimden emin değilim.
Ryan

@MohammadAbuShady'nin dediği gibi, klasörde bir dizin dosyası yoktu ve bu hatayı aldım.
ajon

Ben sadece tekrar bu hata var, ama bu kez sorun yanlışlıkla belirlersiniz olmasıydı rootolmak /Users/myUsername/code/appyerine /Users/myUsername/code/app/public.
Ryan

Bu, sunucu yöneticilerinin parladığı zamandır. detayları
OldFart

Yanıtlar:


171

Dizin dizine alma özelliğiniz varsa ve bu sorunu yaşıyorsanız, büyük olasılıkla kullandığınız try_files bir dizin seçeneğine sahip olduğundan:

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

Çıkarın ve çalışmalıdır:

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

Bu neden oluyor?

TL; DR: Bunun nedeni, nginx'in dizini dizine eklemeye çalışması ve kendiliğinden engellenmesidir. OP tarafından belirtilen hatayı atmak.

try_files $uri $uri/anlamına gelir, kök dizinden, bu işaret uriyoksa, bunun yerine bir dizin deneyin (bu nedenle /) işaretli dosyayı deneyin . Nginx bir dizine eriştiğinde, dizine eklemeye ve içindeki dosyaların listesini tarayıcıya / istemciye döndürmeye çalışır, ancak varsayılan dizin dizine alma devre dışıdır ve bu nedenle "Nginx 403 hatası: [dizin] dizin dizini yasak".

Dizin endeksleme şu seçenekle kontrol edilir autoindex: https://nginx.org/en/docs/http/ngx_http_autoindex_module.html


Bu benim yaşadığım problem. Neden denemediğini anlayamıyordum try_files, index.php"dizin dizini yasak" ile 403 almaya devam ettim
Travis D

4
@JCM, sen bir açıklama ekleyerek misin neden olan $uri/bir sorun yaratır?
Ian Dunn


1
Aynı hatayla karşılaştım. Her ikisi de bir alt etki alanında 2 site vardı. $ Uri / hile yaptı. Teşekkürler!
jivanrij

5
@luminol try_files $uri $uri/, web kökünden, uri tarafından gösterilen dosyayı deneyin, yoksa, bunun yerine bir dizin deneyin (dolayısıyla /). Nginx bir dizine eriştiğinde, dizine eklemeye ve içindeki dosyaların listesini tarayıcıya / istemciye döndürmeye çalışır, ancak varsayılan dizin dizine alma devre dışıdır ve bu nedenle "Nginx 403 hatası: [dizin] dizin dizini yasak". Dizin indeksleme autoindexseçeneği ile kontrol edilir : nginx.org/tr/docs/http/ngx_http_autoindex_module.html
JCM

67

Çalışan yapılandırma:

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

}

Sonra tarayıcıdaki tek çıktı Laravel hatasıydı: “Hata! Bir şeyler ters gitti gibi görünüyor.”

Çalıştırmayın chmod -R 777 app/storage( not ). Dünya çapında yazılabilir bir şey yapmak kötü güvenliktir.

chmod -R 755 app/storage çalışır ve daha güvenlidir.


1
Evet, haklısınız; bu kötü bir fikir. Cevabımı güncelleyeceğim. İnsanlar ayrıca stackoverflow.com/a/11996645/470749
Ryan'dan

1
Ayrıca klasör grubunu nginx grubuna değiştirme seçeneğiniz de olabilir, örneğin www-datadebian. Sonra klasörde daha katı izinler bile ayarlıyoruz: chmod -R 640 app/storagethen chown -R :www-data app/storage. Bu şekilde dosyalar yalnızca uygulama sahibi ve web sunucusu tarafından görülebilir. Ve hiç kimse depolanan (muhtemelen yüklenen) dosyalardan hiçbirini doğrudan yürütemez. Nginx'in dosyalara erişmek için sadece okuma iznine ihtiyacı vardır.
14'te

3
Kendine Not: Sadece bu Nginx 403 var tekrar ve tekrar sorun yanlışlıkla bıraktığı olmasıydı public/üzerinde root /usr/share/nginx/mysitename/public/;. Ekledikten public/ve çalıştırdıktan sonra service nginx restartçalıştı.
Ryan

Peki ya pencereler?
Himanshu Bansal

58

Sadece dizin içeriğini listelemeye çalışıyorsanız aşağıdaki autoindex on;gibi kullanın :

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
Kesinlikle istemiyorum autoindex on; dizin içeriğimi halka göstermek kötü bir fikir olurdu.
Ryan

5
@Ryan Her zaman "Ne yapmak istiyorsun?"
Bhargav Nanekalva

13
403 hatalarını kaldırmak ve web sayfalarının dizin içeriğinin tamamını görüntülememesini göstermek istediğini açıktır (esp yukarıdaki tartışmada verilmiştir)
jpmorris

21


Web sayfasında benzer bir hatayla karşılaştım --- "403 Yasak"
--- "13: İzin reddedildi" /var/log/nginx/error.log hata günlüğünde

3 Adımdan azı benim için çalıştı:

1: Terminali açın, aşağıdaki gibi bir şey gördüm

user1@comp1:/home/www/

Yani, kullanıcı adım "user1" (yukarıdan)

2: /etc/nginx/nginx.conf dosyasında değişen kullanıcı

# user www-data;
user user1;

3: Nginx'i yeniden yükledim

sudo nginx -s reload  

Ayrıca, dosya / klasör izinlerini uyguladım (3 adımı aşmadan önce)
(dizinime 755, / dir1 / diyelim) & (bu dizin altındaki dosyalar için 644):
(Bu ek adım gerçekten ise gerekli, 3 adımdan biraz fazlası yeterli olabilir):

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

Umarım bu hızlı birine yardımcı olur. İyi şanslar.


1
Teşekkürler kardeşim, aynı sorunu yaşadım ve izinler yüzünden oldu. Klasör ve dosya izinlerini ayarladım ve şimdi iyi çalışıyor.
Altaf Hussain

2
Yardımcı olduğumu duyduğuma sevindim. (Bilinen alan adınızdaki diğerlerine, boş zamanlarınızda, mümkünse, hiçbir şey beklemeden yardım edin)
Manohar Reddy Poreddy

Yardımcı olduğunu duyduğuma sevindim.
Manohar Reddy Poreddy

10

Aslında kontrol etmeniz gereken birkaç şey var. 1. nginx'inizin çalışma durumunu kontrol edin

ps -ef|grep nginx

ps aux|grep nginx|grep -v grep

Burada nginx'in kimin çalıştığını kontrol etmeliyiz. lütfen kullanıcıyı ve grubu hatırla

  1. klasörün erişim durumunu kontrol et

    ls -alt

  2. nginx'lerle klasörün durumu ile karşılaştır

(1) klasörün erişim durumu doğru değilse

sudo chmod 755 /your_folder_path

(2) klasörün kullanıcısı ve grubu nginx'in çalışmasıyla aynı değilse

sudo chown your_user_name:your_group_name /your_folder_path

ve nginx'in çalışan kullanıcı adını ve grubunu değiştirin

nginx -h

nginx yapılandırma dosyasının nerede olduğunu bulmak için

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

Çünkü nginx varsayılan çalışanın kullanıcısı ve grubu hiç kimse değildir. bu kullanıcıyı ve grubu fark etmediysek, 403 tanıtılacak.


8

Aynı sorunu yaşadım, logfile bana bu hatayı gösterdi:

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"

Codeignitor çerçeveli bir PHP uygulaması barındırıyorum. Yüklenen dosyaları görüntülemek istediğimde403 Error .

Sorun şu ki, nginx.conf düzgün tanımlanmadı. Onun yerine

index index.html index.htm index.php

sadece dahil ettim

index index.php

Kökümde bir index.php var ve bunun yeterli olduğunu düşündüm, yanılmışım;) İpucu bana NginxLibrary verdi


Teţekkürler .. Ben ayný bottaydým .. Wordpress'imin neden çalýţmadýđýný anlayarak saatler geçirdim! benim wordpress kurulum çalışması için nginx ana yapılandırmada dizin yönergesi gereklidir include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; index index.html index.htm index.php;
mboy

6

Bunu Nginx ilkesi (örn. "Deny") nedeniyle alabilirsiniz veya Nginx yanlış yapılandırması nedeniyle alabilirsiniz veya dosya sistemi kısıtlamaları nedeniyle bunu alabilirsiniz.

Daha sonra olup olmadığını belirleyebilir (ve muhtemelen strace kullanarak yanlış bir konfigürasyonun kanıtını görebilirsiniz (OP'nin buna erişimi olmayacaktır):

# 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

Burada bir test koştu nginx tarafından yapılan dosya sistemi etkinliğini inceliyorum (Ben sizinle aynı hatayı vardı).

İşte o zaman yapılandırmamın seçilmiş bir kısmı

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

Benim durumumda, strace oldukça açık bir şekilde gösterildiği gibi, "takma" içinde "dizin" katılmak beklediğim gibi değildi ve her zaman / ile dizin adlarını ekleme alışkanlığı almak gerekir gibi görünüyor, bu yüzden benim durumumda, aşağıdakiler çalıştı:

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

Bunun için teşekkürler. Bir izin sorunum olmadığını biliyordum ve yorumunuz çözümü bulmama yardımcı oldu. Takma adımın sonuna "/" ekledim ve iyi çalışıyor.
kzahel

sen benim kahraman @Cameron Kerr, benim tecrübeme göre sorun nginx zam 403 diğer ad dizininde dosyaları bulunamadı için /home/web/public. Neden nginx bu bulunamadı dosyaları erişmek için deneyin çünkü ben bu index index.html index.htm index.nginx-debian.html;dosyaları genel dir içinde değil çünkü bu satırı kaldırmayı unuttum çünkü .
Agung Prasetyo

4

Bazı izin sorunu gibi görünüyor.

MySite1'de yaptığınız gibi tüm izinleri diğer siteye ayarlamaya çalışın.

Varsayılan olarak dosya izinleri 644 ve dirs 755 olmalıdır. Ayrıca nginx çalıştıran kullanıcının bu dosyaları ve dizinleri okuma izni olup olmadığını da kontrol edin.


3

yolu try_filesişaret etmek için değiştirmek, index.php"Laravel" de böyle bir şey olması gerektiğini söyledi

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

Ve "codeigniter" projesinde böyle deneyin

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

3

Kullandığınız php-fpmiçin php-fpmkullanıcının kullanıcıyla aynı olduğundan emin olmalısınız nginx.

Kontrol edin /etc/php-fpm.d/www.confve nginxdeğilse php kullanıcı ve grup olarak ayarlayın .

php-fpmKullanıcı yazma izni gerekiyor.


2

Statik dosyalar dizininizde yürütme iznine ihtiyacınız var. Ayrıca nginx kullanıcı ve grubunuz tarafından seçilmeleri gerekir.


1
Bence sadece nginx süreci için okuma iznine ihtiyacı var?
14'te

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

Varsayılanı değiştir

fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

için

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

sorunumu çözdü.


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"    

Ubuntu 15.10 çalıştırıyordum ve basit bir nedenden ötürü 403 Yasak hatayla karşılaştım. Nginx.conf dosyasında (nginx için yapılandırma dosyası) kullanıcı 'www-data' idi. Kullanıcı adını [kullanıcı adım] olarak değiştirdikten sonra, kullanıcı adım için gerekli izinlerin verildiğini varsayarak işe yaradı. Adımları takip ettim:

chmod 755 /path/to/your/app    

Yapılandırma dosyam şöyle görünüyor:

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

Benim için sorun, baz hattı dışında herhangi bir yolun çalışmasıydı, bu satırı eklemek sorunumu düzeltti:

index           index.php;

Tam şey:

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

Bu sorunu çözmek için tam bir gece geçirdim. İşte bu hikayedeki iki sentim,

Phh tercüman olarak hhvm kullanıp kullanmadığınızı kontrol edin . Ardından, 9000 numaralı bağlantı noktasını dinliyor olabilir, böylece web sunucunuzun yapılandırmasını değiştirmeniz gerekir.

Bu bir yan nottur: mysql kullanıyorsanız ve hhvm'den mysql'e bağlantı yapmak imkansız hale gelirse, apparmor'un kurulu olup olmadığını kontrol edin . devre dışı bırak.


0

Aşağıdaki gibi yapılandırırsanız sorunumu çözdüm:

location = /login {
    index  login2.html;
}

403 hatasını gösterir.

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

Denedim autoindex onama çalışmıyor. Yapılandırmamı bu şekilde değiştirirsem çalışır.

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

Bence tam eşleme, eğer bir yol bir dizin olmalı.


0

dizin seçeneğini korumak istediğinizde, index.php dosyasını böyle $ uri'nin önüne koyabilirsiniz.

try_files /index.php $uri $uri/
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.