Ошибка Nginx 403: индекс каталога [папки] запрещен


183

У меня есть 3 доменных имени, и я пытаюсь разместить все 3 сайта на одном сервере (дроплет Digital Ocean), используя 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файлов, вы убедились, что они существуют в этой папке?
— Мухаммед Абу Шади

О, ты прав; 2 сайта, которые не работают, это проект Laravel (у которого есть index.php в подпапке / public) и старый проект CodeIgniter (у которого есть index.php в подпапке / public_web). Но я не уверен, как изменить мою конфигурацию, чтобы сайты работали.
— Райан

Как сказал @MohammadAbuShady, у меня не было индексного файла в папке, и я получил эту ошибку.
— 17

Я только что получил эту ошибку снова, но на этот раз проблема в том , что я случайно установить , rootчтобы быть /Users/myUsername/code/appвместо /Users/myUsername/code/app/public.
— Райан

Это когда администраторы сервера светят. подробности
— OldFart

Ответы:


171

Если у вас отключена индексация каталога, и у вас возникла эта проблема, возможно, потому, что у используемых вами файлов try_file есть опция каталога:

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 с "индекс каталога ... запрещено"
— Трэвис Д

4
@JCM, не могли бы вы добавлять объяснение , почему имея $uri/создает проблему?
— Ян Данн

Решил и мою
— alariva

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/storagethen chown -R :www-data app/storage. Таким образом, файлы видны только владельцу приложения и веб-серверу. И никто вообще не может выполнить любой из сохраненных (возможно, загруженных) файлов напрямую. Nginx нужно только разрешение на чтение для доступа к файлам.
— Завершён

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

что насчет окон?
— Химаншу

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
@ Райан Это всегда сводится к "Что вы хотите сделать?"
— Бхаргав Нанекалва

13
Совершенно очевидно, что он хочет удалить 403 ошибки и заставить веб-страницы показывать не отображать все содержимое каталога (особенно если учесть вышеизложенное)
— jpmorris

21

Я обнаружил похожую ошибку
--- «403 Forbidden» на веб-странице
--- «13: Permission denied» в журнале ошибок по адресу /var/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
Рад слышать, что я полезен. (Помогите другим, в вашем известном домене, в свободное время, если это возможно, не ожидая ничего
— взамен

Рад слышать, что это помогло.
— Манохар Редди Поредди

10

На самом деле есть несколько вещей, которые вы должны проверить. 1. проверьте работоспособность вашего nginx

ps -ef|grep nginx

ps aux|grep nginx|grep -v grep

Здесь нам нужно проверить, кто запускает nginx. пожалуйста, запомните пользователя и группу

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

    ls -alt

  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-приложение с рамкой codeignitor. Когда я хотел просмотреть загруженные файлы, я получил 403 Error.

Проблема заключалась в том, что nginx.conf он не был правильно определен. Вместо того

index index.html index.htm index.php

я только включил

index index.php

У меня есть index.php в корне, и я подумал, что этого достаточно, я ошибся;) Намек дал мне NginxLibrary


Спасибо человек .. Я был на той же лодке .. Я часами выяснял, почему мой WordPress не работает вообще! Директива index необходима в основном конфиге nginx, чтобы моя установка include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; index index.html index.htm index.php;
— WordPress

6

Вы можете получить это из-за политики Nginx (например, «deny»), или вы можете получить это из-за неправильной конфигурации Nginx, или вы можете получить это из-за ограничений файловой системы.

Вы можете определить, является ли он более поздним (и, возможно, увидеть свидетельство неверной конфигурации, используя strace (за исключением того, что OP не будет иметь доступа к этому):

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

В моем случае, как ясно показывает strace, присоединение «псевдонима» к «индексу» было не тем, что я ожидал, и, похоже, мне нужно привыкнуть всегда добавлять имена каталогов с помощью /, поэтому в моем случае сработало следующее:

    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;так как эти файлы не находятся в моей общедоступной директории.
— Агунг Празетио

4

Это похоже на некоторые проблемы с разрешениями.

Попробуйте установить все разрешения, как вы сделали в mysite1 для других сайтов.

По умолчанию права доступа к файлам должны быть 644, а каталоги 755. Также проверьте, есть ли у пользователя, который запускает nginx, разрешение на чтение этих файлов и каталогов.


3

измените, try_filesчтобы указать index.phpпуть, в "Laravel", который вы упомянули, должно быть что-то вроде этого

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

А в проекте "codeigniter" попробуй вот так

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

3

Поскольку вы используете php-fpm, вы должны убедиться, что php-fpmпользователь совпадает с nginxпользователем.

Проверьте /etc/php-fpm.d/www.confи установите php user и group, 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 Forbidden по простой причине. В файле 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.