nginx 空目录返回 404 而不是 403

nginx 空目录返回 404 而不是 403

我的 nginx 服务器配置如下:

server {
    listen 80 default_server;
    server_name example.com www.example.com;
    root /var/www/example.com/web;

    index index.php index.html;

    location / {
        # try to serve file directly, fallback to rewrite
        try_files $uri $uri/ @rewriteapp;
    }

    location @rewriteapp {
        # rewrite all to index.php
        rewrite ^(.*)$ /index.php last;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
    }
}

以及以下目录结构:

/var/www/example.com/:

  1. /index.php
  2. /目录/index.html
  3. /空的/

当客户端点击:'example.com/dir/' 然后索引.html已送达。

当客户端点击一些不存在的 URL 时,例如:'example.com/non-existent/' 然后索引.php在根目录中提供服务。

但当客户点击:'example.com/empty/' 然后403状态代码已发送。

  1. 为什么发送403什么时候404更合适的原因是该目录中缺少索引文件?
  2. 我如何将这些请求映射到索引.php(@rewriteapp)?

答案1

  1. 发生这种情况的原因是,在大多数 Web 服务器中,文件夹的默认操作是“目录列表”,默认情况下该操作是禁用的。如果您禁用目录索引,Apache 中通常也会发生同样的情况。您可以在 nginx 中执行的操作是将 =404 放在 try_files 指令的末尾。

  2. 您可以通过将 /index.php 放在 try_files 指令的末尾来实现这一点。但是,出于安全原因,这并不总是可取的。

另外,您的配置中存在对 nginx 的小误解:您应该将 $uri/ 替换为 $uri/index.php 或 $uri/index.html 或其他任何内容。它会在 try_files $uri/ 处停止,因为它确实找到了该位置,但用户被禁止访问它。

答案2

如果你想让 nginx 发送 404每当否则会发送 403,这已经完成了error_page

server {
    root /var/www/example.com/web;
    error_page 404      /s/404.html;
    error_page 403 =404 /s/404.html;
    location /s/404.html { internal; }

    # etc
}

locationhttp://example.com/s/404.html也会导致出现 404 错误。

答案3

另外,您的配置中存在对 nginx 的小误解:您应该将 $uri/ 替换为 $uri/index.php 或 $uri/index.html 或其他任何内容。它会在 try_files $uri/ 处停止,因为它确实找到了该位置,但用户被禁止访问它。

这对我有用,因为它被认可为正确答案:)

谢谢 Florin Asăvoaie

location ^~ /folder_of_prefix {
        alias /home/user/html;
           try_files  $uri/index.html  =404;

    }

答案4

在索引指令后添加斜线(带或不带一些虚假名称,例如//404.html)即可达到此目的。例如:

index index.html index.php /;

不确定这是否安全,因此使用时请自负风险。

相关内容