我的 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
- /目录/index.html
- /空的/
当客户端点击:'example.com/dir/' 然后索引.html已送达。
当客户端点击一些不存在的 URL 时,例如:'example.com/non-existent/' 然后索引.php在根目录中提供服务。
但当客户点击:'example.com/empty/' 然后403状态代码已发送。
- 为什么发送403什么时候404更合适的原因是该目录中缺少索引文件?
- 我如何将这些请求映射到索引.php(@rewriteapp)?
答案1
发生这种情况的原因是,在大多数 Web 服务器中,文件夹的默认操作是“目录列表”,默认情况下该操作是禁用的。如果您禁用目录索引,Apache 中通常也会发生同样的情况。您可以在 nginx 中执行的操作是将 =404 放在 try_files 指令的末尾。
您可以通过将 /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
}
该location
行http://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 /;
不确定这是否安全,因此使用时请自负风险。