Nginx
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/:
- /index.php
- /dir/index.html
- /空的/
當客戶端點擊:’ example.com/dir/ ‘然後index.html被提供。
當客戶端點擊一些不存在的 URL 時,例如:’ example.com/non-existent/ ‘,那麼index.php將在根目錄中提供。
但是當客戶端點擊:“ example.com/empty/ ”時,會發送403狀態碼。
- 為什麼在404更合適的情況下發送403 ,因為此目錄中缺少索引文件?
- 如何將此類請求映射到index.php (@rewriteapp)?
- 發生這種情況是因為,在大多數 Web 伺服器中,文件夾的預設操作是“目錄列表”,預設情況下是禁用的。如果您禁用目錄索引,通常在 Apache 中也會發生同樣的情況。您可以在 nginx 中做的是將 =404 放在 try_files 指令的末尾。
- 您可以通過將 /index.php 放在 try_files 指令的末尾來做到這一點。但是,由於安全原因,這並不總是值得推薦的。
另外,你的配置中對nginx有一個小誤區:應該替換 $ uri/ with $ uri/index.php 或 $ uri/index.html or whatever. It stops at try_files $ uri/ 因為它確實找到了該位置,但禁止使用者訪問它。