Nginx

nginx 404 而不是 403 用於空目錄

  • October 22, 2021

我的 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. /dir/index.html
  3. /空的/

當客戶端點擊:’ example.com/dir/ ‘然後index.html被提供。

當客戶端點擊一些不存在的 URL 時,例如:’ example.com/non-existent/ ‘,那麼index.php將在根目錄中提供。

但是當客戶端點擊:“ example.com/empty/ ”時,會發送403狀態碼。

  1. 為什麼在404更合適的情況下發送403 ,因為此目錄中缺少索引文件?
  2. 如何將此類請求映射到index.php (@rewriteapp)?
  1. 發生這種情況是因為,在大多數 Web 伺服器中,文件夾的預設操作是“目錄列表”,預設情況下是禁用的。如果您禁用目錄索引,通常在 Apache 中也會發生同樣的情況。您可以在 nginx 中做的是將 =404 放在 try_files 指令的末尾。
  2. 您可以通過將 /index.php 放在 try_files 指令的末尾來做到這一點。但是,由於安全原因,這並不總是值得推薦的。

另外,你的配置中對nginx有一個小誤區:應該替換 $ uri/ with $ uri/index.php 或 $ uri/index.html or whatever. It stops at try_files $ uri/ 因為它確實找到了該位置,但禁止使用者訪問它。

引用自:https://serverfault.com/questions/610305