Ошибка 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.

JCM
источник
Это именно та проблема, которая у меня была. Я не мог понять, почему 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.

Haimei
источник
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

theDrifter
источник
Спасибо человек .. Я был на той же лодке .. Я часами выяснял, почему мой 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, разрешение на чтение этих файлов и каталогов.

Tomahock
источник
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.

Rhys
источник
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;

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

wave_1102
источник
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 . отключи это.

user9869932
источник
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/
xoyabc
источник