Lỗi Nginx 403: chỉ mục thư mục của [thư mục] bị cấm


183

Tôi có 3 tên miền và tôi đang cố gắng lưu trữ cả 3 trang web trên một máy chủ (một giọt Digital Ocean) bằng Nginx.

mysite1.name mysite2.name mysite3.name

Chỉ có 1 trong số họ hoạt động. Hai kết quả còn lại trong 403 lỗi (theo cùng một cách).

Trong nhật ký lỗi nginx của tôi, tôi thấy : [error] 13108#0: *1 directory index of "/usr/share/nginx/mysite2.name/live/" is forbidden.

Cấu hình kích hoạt trang web của tôi là:

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

Tất cả 3 trang web có tập tin cấu hình gần như giống hệt nhau.

Các tệp của mỗi trang web nằm trong các thư mục như /usr/share/nginx/mysite1.name/someFolder và sau đó /usr/share/nginx/mysite1.name/live là một liên kết tượng trưng cho điều đó. (Tương tự cho mysite2 và mysite3.)

Tôi đã xem Nginx 403 bị cấm đối với tất cả các tệp nhưng điều đó không có ích.

Bất kỳ ý tưởng về những gì có thể sai?


24
Tôi nghĩ rằng bạn có index.html index.phptập tin bị thiếu, bạn có chắc chắn rằng chúng tồn tại trong thư mục đó?
Mohammad AbuShady

Ồ bạn nói đúng; 2 trang web không hoạt động là một dự án Laravel (có index.php trong / thư mục con công khai) và một dự án CodeIgniter cũ (có index.php trong thư mục con / public_web). Nhưng tôi không chắc làm thế nào để thay đổi cấu hình của mình để làm cho các trang web hoạt động.
Ryan

Giống như @MohammadAbuShady nói, tôi không có tệp chỉ mục trong thư mục và gặp lỗi này.
ajon

Tôi chỉ có lỗi này một lần nữa, nhưng lần này vấn đề là tôi muốn vô tình thiết lập rootđược /Users/myUsername/code/appthay /Users/myUsername/code/app/public.
Ryan

Đây là khi quản trị viên máy chủ tỏa sáng. chi tiết
OldFart

Câu trả lời:


171

Nếu bạn đã lập chỉ mục thư mục và gặp sự cố này, có thể là do try_files bạn đang sử dụng có tùy chọn thư mục:

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

Loại bỏ nó và nó sẽ hoạt động:

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

Tại sao điều này xảy ra

TL; DR: Điều này được gây ra bởi vì nginx sẽ cố gắng lập chỉ mục thư mục và bị chặn bởi chính nó. Ném lỗi được đề cập bởi OP.

try_files $uri $uri/có nghĩa là, từ thư mục gốc, hãy thử tệp được trỏ bởi uri, nếu điều đó không tồn tại, hãy thử một thư mục thay thế (do đó /). Khi nginx truy cập vào một thư mục, nó sẽ cố gắng lập chỉ mục và trả lại danh sách các tệp bên trong nó cho trình duyệt / máy khách, tuy nhiên theo chỉ mục thư mục mặc định bị vô hiệu hóa và do đó, nó trả về lỗi "Nginx 403 error: chỉ mục thư mục của [thư mục] bị cấm".

Lập chỉ mục thư mục được kiểm soát bởi autoindextùy chọn: https://nginx.org/en/docs/http/ngx_http_autoindex_module.html


Đây chính xác là vấn đề tôi đang gặp phải. Tôi không thể hiểu tại sao try_fileskhông thử index.php, tôi cứ tiếp tục nhận 403 với "chỉ mục thư mục của ... bị cấm"
Travis D

4
@JCM, bạn sẽ nhớ thêm một giải thích về lý do tại sao$uri/tạo ra một vấn đề?
Ian Dunn

Tôi cũng đã giải quyết được
alariva

1
Tôi đã có những lỗi giống nhau. Tôi đã có 2 trang web, cả hai trong một tên miền phụ. Loại bỏ $ uri / đã thực hiện thủ thuật. Cảm ơn!
jivanrij

5
@luminol try_files $uri $uri/có nghĩa là, từ gốc web, hãy thử tệp được chỉ ra bởi uri, nếu điều đó không tồn tại, hãy thử một thư mục thay thế (vì thế /). Khi nginx truy cập vào một thư mục, nó sẽ cố gắng lập chỉ mục và trả lại danh sách các tệp bên trong nó cho trình duyệt / máy khách, tuy nhiên theo chỉ mục thư mục mặc định bị vô hiệu hóa và do đó, nó trả về lỗi "Nginx 403 error: chỉ mục thư mục của [thư mục] bị cấm". Lập chỉ mục thư mục được kiểm soát bởi autoindextùy chọn: nginx.org/en/docs/http/ngx_http_autoindex_module.html
JCM

67

Đây là cấu hình hoạt động:

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

}

Sau đó, kết quả đầu ra duy nhất trong trình duyệt là lỗi Laravel: Who Whoops, có vẻ như đã xảy ra sự cố.

KHÔNG chạy chmod -R 777 app/storage( lưu ý ). Làm một cái gì đó có thể ghi được trên thế giới là an ninh xấu.

chmod -R 755 app/storage hoạt động và an toàn hơn.


1
Vâng, các bạn nói đúng; đó là một ý tưởng tồi Tôi sẽ cập nhật câu trả lời của tôi. Mọi người cũng có thể được hưởng lợi từ stackoverflow.com/a/11996645/470749
Ryan

1
Bạn cũng có thể có tùy chọn thay đổi nhóm thư mục thành nhóm nginx tức là www-datatrên debian. Sau đó thiết lập các quyền thậm chí chặt chẽ hơn trên thư mục như: chmod -R 640 app/storagesau đó chown -R :www-data app/storage. Bằng cách này, các tệp chỉ hiển thị cho chủ sở hữu ứng dụng và máy chủ web. Và không ai có thể thực hiện trực tiếp bất kỳ tệp nào được lưu trữ (có thể được tải lên). Nginx chỉ cần đọc quyền truy cập các tập tin.
tuân thủ

3
Lưu ý để tự: Tôi chỉ có Nginx này 403 một lần nữamột lần nữa vấn đề là tôi đã vô tình rời đi public/vào root /usr/share/nginx/mysitename/public/;. Sau khi thêm public/và chạy service nginx restart, nó đã làm việc.
Ryan

Còn cửa sổ thì sao?
Himanshu Bansal

58

Nếu bạn chỉ đơn giản là cố gắng liệt kê nội dung thư mục, hãy sử dụng autoindex on;như:

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
Tôi chắc chắn không muốn autoindex on; sẽ là một ý tưởng tồi để phơi bày nội dung thư mục của tôi ra công chúng.
Ryan

5
@Ryan Nó luôn đi xuống "Bạn muốn làm gì?"
Bhargav Nanekalva 17/12/14

13
Rõ ràng là anh ta muốn xóa 403 lỗi và để các trang web hiển thị không hiển thị toàn bộ nội dung thư mục (đặc biệt là đã thảo luận ở trên)
jpmorris

21

Tôi đã gặp lỗi tương tự
--- "403 Bị cấm" trong trang web
--- "13: Quyền bị từ chối" trong nhật ký lỗi tại /var/log/nginx/error.log

Dưới 3 bước làm việc cho tôi:

1: Mở Terminal, thấy một cái gì đó như dưới đây

user1@comp1:/home/www/

Vì vậy, tên người dùng của tôi là "user1" (từ phía trên)

2: Người dùng đã thay đổi trong /etc/nginx/nginx.conf

# user www-data;
user user1;

3: Tải lại nginx

sudo nginx -s reload  

Ngoài ra, tôi đã áp dụng quyền truy cập tệp / thư mục (trước khi tôi thực hiện trên 3 bước)
(755 vào thư mục của tôi, nói / dir1 /) & (644 cho các tệp trong thư mục đó):
(Tôi không chắc chắn, nếu bước bổ sung này thực sự là bắt buộc, chỉ cần trên 3 bước là đủ):

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

Hy vọng điều này sẽ giúp nhanh chóng một ai đó. May mắn nhất.


1
Cảm ơn người anh em, tôi đã có cùng một vấn đề, và đó là vì sự cho phép. Tôi đặt quyền truy cập thư mục và tệp, và bây giờ nó đang hoạt động tốt.
Altaf Hussain

2
Vui mừng khi nghe tôi hữu ích. (Giúp đỡ người khác, trong miền bạn biết, trong thời gian rảnh, nếu có thể, mà không mong đợi gì trở lại)
Manohar Reddy Poreddy

Vui mừng khi nghe nó đã giúp.
Manohar Reddy Poreddy

10

Trong thực tế có một số điều bạn cần kiểm tra. 1. kiểm tra trạng thái chạy nginx của bạn

ps -ef|grep nginx

ps aux|grep nginx|grep -v grep

Ở đây chúng ta cần kiểm tra ai đang chạy nginx. hãy nhớ người dùng và nhóm

  1. kiểm tra trạng thái truy cập của thư mục

    ls

  2. so sánh với trạng thái của thư mục với nginx's

(1) nếu trạng thái truy cập của thư mục không đúng

sudo chmod 755 /your_folder_path

(2) nếu người dùng và nhóm của thư mục không giống với hoạt động của nginx

sudo chown your_user_name:your_group_name /your_folder_path

và thay đổi tên người dùng và nhóm đang chạy của nginx

nginx -h

để tìm tập tin cấu hình nginx ở đâu

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

Bởi vì người dùng đang chạy mặc định của nginx không phải là ai và nhóm không là ai cả. nếu chúng tôi không nhận thấy người dùng và nhóm này, 403 sẽ được giới thiệu.


8

Tôi đã có cùng một vấn đề, logfile cho tôi thấy lỗi này:

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"

Tôi đang lưu trữ một ứng dụng PHP với khung codeignitor. Khi tôi muốn xem các tập tin tải lên, tôi đã nhận được một403 Error .

Vấn đề là, điều đó nginx.conf không được xác định đúng. Thay vì

index index.html index.htm index.php

tôi chỉ bao gồm

index index.php

Tôi có một tệp index.php trong thư mục gốc của mình và tôi nghĩ thế là đủ, tôi đã sai;) Gợi ý đã cho tôi NginxL Library


Cảm ơn người đàn ông .. Tôi đã ở cùng một chiếc thuyền .. Tôi đã dành hàng giờ để tìm hiểu lý do tại sao wordpress của tôi không hoạt động! Chỉ thị chỉ mục là cần thiết trong cấu hình chính nginx để cài đặt wordpress của tôi hoạt động include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; index index.html index.htm index.php;
mboy

6

Bạn có thể nhận được điều này vì chính sách Nginx (ví dụ: "từ chối") hoặc bạn có thể nhận được điều này do cấu hình sai của Nginx hoặc bạn có thể nhận được điều này vì các hạn chế của hệ thống tệp.

Bạn có thể xác định xem sau này (và có thể thấy bằng chứng về cấu hình sai bằng cách sử dụng strace (ngoại trừ, OP sẽ không có quyền truy cập vào đó):

# 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

Ở đây tôi đang kiểm tra hoạt động của hệ thống tập tin được thực hiện bởi nginx trong khi chạy thử nghiệm (tôi có lỗi giống như bạn).

Đây là một phần được chọn trong cấu hình của tôi tại thời điểm đó

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

Trong trường hợp của tôi, như strace cho thấy khá rõ ràng, việc nối từ "bí danh" vào "chỉ mục" không như tôi mong đợi và có vẻ như tôi cần tập thói quen luôn gắn tên thư mục với a /, vì vậy trong trường hợp của tôi, sau đây làm việc:

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

Cảm ơn vì điều đó. Tôi biết tôi không gặp vấn đề về quyền và nhận xét của bạn đã giúp tôi tìm giải pháp. Tôi đã thêm "/" vào cuối bí danh của mình và nó hoạt động tốt.
kzahel

bạn là anh hùng của tôi @Cameron Kerr, dựa trên kinh nghiệm của tôi, vấn đề là nginx nâng 403 vì không tìm thấy tệp trên thư mục bí danh, vd /home/web/public. Tại sao nginx cố gắng truy cập các tệp không tìm thấy này là do tôi quên xóa dòng này index index.html index.htm index.nginx-debian.html;vì các tệp đó không nằm trong thư mục công khai của tôi.
Agung Prasetyo

4

Nó trông giống như một số vấn đề quyền.

Cố gắng đặt tất cả các hoán vị như bạn đã làm trong mysite1 sang trang web khác.

Theo mặc định, quyền truy cập tệp phải là 644 và thư mục 755. Ngoài ra, hãy kiểm tra xem người dùng chạy nginx có được phép đọc các tệp và thư mục đó không.


3

thay đổi try_filesđể chỉ đến index.phpđường dẫn, trong "Laravel" mà bạn đã đề cập, nó phải giống như thế này

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

Và trong dự án "codeigniter" hãy thử nó như thế này

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

3

Vì bạn đang sử dụng php-fpm, bạn nên đảm bảo rằng php-fpmngười dùng đó giống như nginxngười dùng.

Kiểm tra /etc/php-fpm.d/www.confvà đặt người dùng và nhóm php thành nginxnếu không.

Người php-fpmdùng cần sự cho phép viết.


2

Bạn cần thực thi quyền trên thư mục tệp tĩnh của bạn. Ngoài ra, chúng cần được người dùng và nhóm nginx của bạn yêu thích.


1
Tôi nghĩ rằng anh ta chỉ cần đọc quyền cho quá trình nginx?
tuân thủ

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

Thay đổi mặc định

fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

đến

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

giải quyết vấn đề của tôi


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"    

Tôi đang chạy Ubuntu 15.10 và gặp phải lỗi 403 Cấm vì một lý do đơn giản. Trong nginx.conf (tệp cấu hình cho nginx), người dùng là 'www-data'. Khi tôi thay đổi tên người dùng thành [tên người dùng của tôi], nó hoạt động tốt với giả định rằng các quyền cần thiết đã được cấp cho tên người dùng của tôi. Các bước tiếp theo là tôi:

chmod 755 /path/to/your/app    

Tập tin cấu hình của tôi trông như thế này:

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

Đối với tôi, vấn đề là bất kỳ tuyến nào khác ngoài tuyến cơ sở đều hoạt động, việc thêm tuyến này đã khắc phục vấn đề của tôi:

index           index.php;

Điều đầy đủ:

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

Để khắc phục vấn đề này, tôi đã dành cả một đêm. Đây là hai xu của tôi về câu chuyện này,

Kiểm tra xem bạn có đang sử dụng hhvm làm trình thông dịch php không. Sau đó, có thể nó đang nghe trên cổng 9000, do đó bạn sẽ phải sửa đổi cấu hình máy chủ web của mình.

Đây là một lưu ý phụ: Nếu bạn đang sử dụng mysql và các kết nối từ hhvm đến mysql trở nên không thể, hãy kiểm tra xem bạn đã cài đặt apparmor chưa . vô hiệu hóa nó


0

Tôi đã giải quyết vấn đề của mình, nếu tôi định cấu hình như sau:

location = /login {
    index  login2.html;
}

Nó sẽ hiển thị lỗi 403.

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

Tôi đã thử autoindex on, nhưng không hoạt động. Nếu tôi thay đổi cấu hình của tôi như thế này, nó hoạt động.

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

Tôi nghĩ rằng kết hợp chính xác, nếu đó là một đường dẫn nên là một thư mục.


0

Khi bạn muốn giữ tùy chọn thư mục, bạn có thể đặt index.php trước $ uri như thế này.

try_files /index.php $uri $uri/
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.