nginx 禁用目录浏览不起作用

nginx 禁用目录浏览不起作用

我有一个正在生产中的 Django 应用程序,我的 Web 服务器是 Nginx。

我的应用程序位于/home/rouizi/blog,假设我的域名是example.com。我想防止用户读取位于blog文件夹内的文件。

例如,按照我的实际配置,如果有人访问,exemple.com/manage.py他就可以看到该文件的内容。我想向他显示一个404 not found错误。

这是我的 nginx 配置:

/etc/nginx/nginx.conf

user www-data;
worker_processes auto;

pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 1024;
}

http {
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        types_hash_max_size 2048;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        include /etc/nginx/conf.d/*.conf;

       add_header    X-Content-Type-Options nosniff;
       add_header    X-Frame-Options SAMEORIGIN;
       add_header    X-XSS-Protection "1; mode=block";

       server_tokens off;
       keepalive_timeout 75;
}

/etc/nginx/conf.d/example.conf

server {
    if ($host = www.example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    if ($host = example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen         80;
    server_name    example.com www.example.com;
    return         301 https://example.com$request_uri;
}

server {
    listen                          443 ssl http2 default_server;
    listen                          [::]:443 ssl http2 default_server;
    
    #  ssl stuff

    server_name                     example.com www.example.com;
    root                            /home/rouizi/blog/;
    index                           index.html;

    location /static {
        alias /home/rouizi/blog/staticfiles/;
     }

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect off;
        if (!-f $request_filename) {
            proxy_pass http://127.0.0.1:8000;
            break;
        }
    }

    gzip             on;
    gzip_comp_level  3;
    gzip_types       text/plain text/css application/javascript image/*;
}

我到目前为止尝试过的:

我添加了指令autoindex on;并重新加载 nginx。没有用

index.html在里面添加了一个空文件blog directory并重新加载了 nginx。没有用

我怎么解决这个问题 ?

编辑

我发现如果我在指令中输入我的 IP 地址而不是我的域名,server_name目录浏览就会被禁用:

/etc/nginx/conf.d/example.conf

# ...

server {
    # ...
    #  ssl stuff

    server_name                     139.151.187.143;
    
    # ...

}

就像这样,如果我转到exemple.com/manage.py或其他文件,404 not found我的 Dango 应用程序就会出错。而且静态和媒体文件也不再可用。

有人能解释一下原因吗?这是否与我的 DNS 托管提供商有关?

答案1

static对于 Django 驱动的应用程序,您通常不需要提供除了专门复制到文件夹的文件之外的任何内容。

典型设置工作原理如下:

  1. 所有内容/static都由 Web 服务器处理(这就是该location /static {}块的作用:指向 django命令放置静态文件alias的目录)collectstatic
  2. /media根据需要对某个位置进行类似处理
  3. 其他一切都会被转发到 wsgi 应用程序(这意味着你的程序文件不是直接访问nginx服务器)

您想要的可能是删除root /home/rouizi/blog/;并无条件地(不在if (!-f $request_filename) {块内)转发请求到您的 wsgi 应用程序。

答案2

您需要配置正在运行的应用程序127.0.0.1:8000来阻止这些请求。

nginx 只是将以 开头的所有请求传递/给您的 Web 应用程序,以 开头的请求除外/static

相关内容