Помилка Nginx 403: індекс каталогів [папки] заборонено


183

У мене є 3 доменних імені і я намагаюся розмістити всі 3 сайти на одному сервері (цифровий цифровий океан) за допомогою Nginx.

mysite1.name mysite2.name mysite3.name

Працює лише 1 з них. Інші два приводять до 403 помилок (таким же чином).

У моїй Nginx журнал помилок, я бачу: [error] 13108#0: *1 directory index of "/usr/share/nginx/mysite2.name/live/" is forbidden.

Налаштування моїх сайтів:

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

Всі 3 сайти мають майже однакові конфігураційні файли.

Файли кожного сайту знаходяться в папках, як /usr/share/nginx/mysite1.name/someFolder, а потім /usr/share/nginx/mysite1.name/live є символьним посиланням на це. (Те саме для mysite2 та mysite3.)

Я переглянув Nginx 403, заборонений для всіх файлів, але це не допомогло.

Будь-які ідеї щодо того, що може бути неправильним?


24
я думаю, у вас index.html index.phpвідсутні файли, ви переконалися, що вони існують у цій папці?
Мохаммед АбуШаді

Ой ви праві; два веб-сайти, які не працюють, - це проект Laravel (який має index.php в підпапці / public) і старий проект CodeIgniter (який має index.php в підпапці / public_web). Але я не впевнений, як змінити конфігурацію, щоб сайти працювали.
Райан

Так само, як сказав @MohammadAbuShady, у мене не було індексного файлу в папці, і я отримав цю помилку.
айон

Я тільки що отримав цю помилку знову, але на цей раз проблема в тому , що я випадково встановити , rootщоб бути /Users/myUsername/code/appзамість /Users/myUsername/code/app/public.
Райан

Це коли сервер адмін. деталі
OldFart

Відповіді:


171

Якщо у вас вимкнено індексацію каталогів і виникає ця проблема, можливо, тому, що в використовуваних файлах try_files є параметр каталогу:

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

Видаліть його, і він повинен працювати:

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

Чому це відбувається

TL; DR: Це викликано тим, що nginx намагатиметься проіндексувати каталог та блокується сам по собі. Викидання помилки, згаданої ОП.

try_files $uri $uri/значить, з кореневого каталогу спробуйте файл, на який вказує uri, якщо цього не існує, спробуйте натомість каталог (звідси і /). Коли nginx отримує доступ до каталогу, він намагається проіндексувати його і повернути список файлів всередині нього до браузера / клієнта, однак за індексуванням каталогів каталогів вимкнено, і тому він повертає помилку "Помилка Nginx 403: індекс каталогу [папки] заборонено ".

Індексація каталогів керується autoindexопцією: https://nginx.org/en/docs/http/ngx_http_autoindex_module.html


Це саме проблема, з якою у мене виникло. Я не міг зрозуміти, чому try_filesне намагався index.php, я просто продовжував отримувати 403 з "індексом каталогу ... заборонено"
Travis D

4
@JCM, НЕ могли б ви додавати пояснення , чому маючи $uri/створює проблему?
Ян Данн

Також
вирішено

1
У мене була така ж помилка. У мене було 2 сайти, обидва в піддомені. Видалення $ uri / зробило трюк. Дякую!
jivanrij

5
@luminol try_files $uri $uri/означає, що з кореня веб-сторінки спробуйте файл, вказаний на uri, якщо цього не існує, спробуйте натомість каталог (звідси /). Коли nginx отримує доступ до каталогу, він намагається проіндексувати його і повернути список файлів всередині нього до браузера / клієнта, однак за індексуванням каталогів каталогів вимкнено, і тому він повертає помилку "Помилка Nginx 403: індекс каталогу [папки] заборонено ". Індексація каталогів керується autoindexопцією: nginx.org/en/docs/http/ngx_http_autoindex_module.html
JCM

67

Ось конфігурація, яка працює:

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

}

Тоді єдиним результатом у браузері була помилка Laravel: "Ну, схоже, щось пішло не так".

НЕ бігайте chmod -R 777 app/storage( примітка ). Зробити щось, що можна записати у світі - це погана безпека.

chmod -R 755 app/storage працює і є більш безпечним.


1
Так, ви, хлопці, праві; це погана ідея. Я оновлю свою відповідь. Люди також можуть скористатися stackoverflow.com/a/11996645/470749
Райан

1
Ви також можете мати можливість змінити групи папок на групу nginx, тобто www-dataна debian. Потім встановіть ще більш жорсткі дозволи для папки типу: chmod -R 640 app/storageтоді chown -R :www-data app/storage. Таким чином файли видно лише власнику програми та веб-серверу. І ніхто не може виконувати будь-який із збережених (можливо, завантажених) файлів безпосередньо. Nginx повинен мати лише дозвіл на читання для доступу до файлів.
компілістичний

3
Примітка для себе: Я тільки що отримав цю Nginx 403 знову і знову проблема в тому , що я випадково зупинився public/на root /usr/share/nginx/mysitename/public/;. Після додавання public/та запуску service nginx restartце спрацювало.
Райан

що з вікнами?
Himanshu Bansal

58

Якщо ви просто намагаєтесь перелічити вміст каталогу, використовуйте 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;
        }
}

9
Я точно не хочу autoindex on; було б поганою ідеєю викривати вміст свого каталогу загальнодоступним.
Райан

5
@Ryan Це завжди зводиться до "Що ти хочеш робити?"
Бхаргав Нанекальва

13
Цілком зрозуміло, що він хоче видалити 403 помилки та отримати веб-сторінки, щоб показати, що не відображається весь вміст каталогів (особливо, враховуючи обговорення вище)
jpmorris

21

Я зіткнувся з подібною помилкою
--- "403 Заборонено" на веб-сторінці
--- "13: Дозвіл відхилено" в журналі помилок за адресою /var/log/log/nginx/error.log

Нижче 3 кроки працювали для мене:

1: Відкрийте термінал, побачив щось подібне нижче

user1@comp1:/home/www/

Отже, моє ім’я користувача "user1" (зверху)

2: Змінено користувача в /etc/nginx/nginx.conf

# user www-data;
user user1;

3: Перезавантажили nginx

sudo nginx -s reload  

Крім того, я застосував дозволи для файлів / папок (до того, як я зробив вище 3 кроки)
(755 до мого каталогу, скажімо / dir1 /) & (644 для файлів у цій директорії):
(Я не впевнений, чи справді цей додатковий крок дійсно потрібно трохи більше 3 кроків):

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

Сподіваюсь, це допоможе комусь швидко. Удачі.


1
Дякую брате, у мене був той самий випуск, і це було через дозволи. Я встановив дозволи на папки та файли, і тепер це працює нормально.
Алтаф Хуссей

2
Радий почути, що я корисний. (Допоможіть іншим, у вашому відомому домені, у вільний час, якщо можливо, не очікуючи нічого назад)
Manohar Reddy Poreddy

Радий почути, що це допомогло.
Манохар Редді Поредді

10

Насправді є кілька речей, які потрібно перевірити. 1. перевірити стан запуску nginx

ps -ef|grep nginx

ps aux|grep nginx|grep -v grep

Тут нам потрібно перевірити, хто працює nginx. запам’ятайте користувача та групу

  1. перевірити стан доступу до папки

    ls -соль

  2. порівняти зі статусом папки з nginx

(1) якщо статус доступу до папки неправильний

sudo chmod 755 /your_folder_path

(2) якщо користувач і група папки не збігаються з запущеними nginx

sudo chown your_user_name:your_group_name /your_folder_path

і змінити запущене ім'я користувача та групу nginx

nginx -h

щоб знайти, де знаходиться файл конфігурації 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

Оскільки користувач nginx, який працює за замовчуванням - це ніхто, а група - це ніхто. якщо ми не помітили цього користувача та групи, буде введено 403.


8

У мене була така ж проблема, лог-файл показав мені цю помилку:

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"

Я розміщую PHP-додаток із кодовим дизайнером. Коли я хотів переглянути завантажені файли, я отримав403 Error .

Проблема полягала в тому, що nginx.conf не було визначено належним чином. Замість

index index.html index.htm index.php

я лише включений

index index.php

У мене є index.php в корені, і я вважав, що цього достатньо, я помилявся;) Підказка дала мені NginxLibrary


Дякую чоловікові .. Я був у тому ж човні .. Я витратив години, розгадуючи, чому моє словодрук взагалі не працює! Директива щодо індексу потрібна в головному конфігурації nginx для роботи моєї установки Wordpress include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; index index.html index.htm index.php;
mboy

6

Ви можете отримати це через політику Nginx (наприклад, "заборонити"), або ви можете отримати це через неправильну конфігурацію Nginx, або ви можете отримати це через обмеження файлової системи.

Ви можете визначити, чи є її пізніше (і, можливо, побачити докази неправильної конфігурації, використовуючи strace (крім того, що ОП не матиме доступу до цього):

# 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

Тут я перевіряю активність файлової системи, виконану nginx, коли виконував тест (у мене була така ж помилка, як і ви).

Ось вибрана частина моєї конфігурації на той час

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

У моєму випадку, як доволі чітко видно стразе, приєднання «псевдоніма» до «індексу» було не тим, чого я очікував, і, здається, мені потрібно ввійти в звичку завжди додавати імена каталогів з /, так у моєму випадку працювало наступне:

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

Дякую за це Я знав, що у мене немає проблеми з дозволом, і ваш коментар допоміг мені знайти рішення. Я додав "/" до кінця свого псевдоніма, і він працює чудово.
kzahel

ви мій герой @Cameron Kerr, на основі мого досвіду проблема полягає в тому, що nginx підвищити 403 для не знайдених файлів у директорії псевдонімів, наприклад /home/web/public. Чому nginx намагається отримати доступ до цих не знайдених файлів, тому що я забув видалити цей рядок, index index.html index.htm index.nginx-debian.html;оскільки файли thats не знаходяться в моєму публічному режимі.
Agung Prasetyo

4

Це виглядає як певна проблема дозволів.

Спробуйте встановити всі дозволи, як ви робили в mysite1, на інший сайт.

За замовчуванням права доступу до файлів повинні бути 644, а dirs 755. Також перевірте, чи має дозвіл на користувач, який працює з nginx, читати ці файли та dirs.


3

змінити try_filesна точку до index.phpшляху, у "Laravel", про який ти згадав, має бути щось подібне

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

І в проекті «кодигітайтер» спробуйте це так

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

3

Оскільки ви користуєтесь php-fpm, ви повинні переконатися, що php-fpmкористувач такий самий, якnginx користувач.

Перевірте /etc/php-fpm.d/www.confта встановіть користувачу та групі php значенняnginx якщо це не так.

php-fpmКористувачеві необхідно дозвіл на запис.


2

Вам потрібен дозвіл на виконання в каталозі статичних файлів. Крім того, їх потрібно порушувати користувачу та групі nginx.


1
Я думаю, що йому потрібен лише дозвіл на читання для процесу nginx?
комлістичний

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

Зміна за замовчуванням

fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

до

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

вирішив мою проблему.


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 і зіткнувся з 403 Забороненою помилкою з простої причини. У nginx.conf (файл конфігурації для nginx) користувачеві було "www-data". Після того, як я змінив ім’я користувача на [моє ім’я користувача], воно спрацювало чудово, передбачаючи, що необхідні дозволи були надані моєму імені користувача. Кроки за мною:

chmod 755 /path/to/your/app    

Мій файл конфігурації виглядає так:

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

Для мене проблема полягала в тому, що будь-які маршрути, окрім базового, працювали, додавши цей рядок, виправили мою проблему:

index           index.php;

Повна річ:

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

Щоб виправити це питання, я провів цілу ніч. Ось два мої центи на цій історії,

Перевірте, чи використовуєте hhvm як інтерпретатор php. Тоді можливо, що він прослуховує порт 9000, тому вам доведеться змінити конфігурацію вашого веб-сервера.

Це побічна примітка: Якщо ви використовуєте mysql, а з'єднання з hhvm до mysql стають неможливими, перевірте, чи встановлено програму apparmor . відключити його.


0

Я вирішив свою проблему, якщо налаштувати так:

location = /login {
    index  login2.html;
}

Він покаже помилку 403.

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

Я намагався autoindex on, але не працював. Якщо я зміню конфігурацію так, вона працює.

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

Я думаю, що точне відповідність, якщо це шлях, повинен бути каталог.


0

коли ви хочете зберегти параметр каталогу, ви можете поставити index.php попереду $ uri, як це.

try_files /index.php $uri $uri/
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.