nginx process = 404 如何在try_files中回退

Posted

技术标签:

【中文标题】nginx process = 404 如何在try_files中回退【英文标题】:How nginx process =404 fallback in try_files 【发布时间】:2019-12-24 22:31:51 【问题描述】:

我有一个示例 Web 服务器,在 www 目录中只有一个 index.html 文件。我可以使用以下配置设置 nginx

location /subfolder 
     alias /data/www;
     try_files $uri $uri/ /index.html;

在浏览器中我可以在我的本地域test.local/subfolder 上看到正确的响应,同时test.local/subfolder/something 返回一个默认的 nginx 页面(这是正常的,因为没有设置 root)

如果我将配置更改为

location /subfolder 
     alias /data/www;
     try_files $uri $uri/ /index.html =404;

test.local/subfolder 的响应仍然正确,但是test.local/subfolder/something 和所有带有/subfolder 前缀的URI 返回一个正确响应的index.html,状态也是200 而不是404。如果我从try_files 中删除/index,我会得到相同的结果结果

我想知道 nginx 如何处理 =404 回退的请求,但找不到任何信息,甚至在官方文档中也没有。

UDAPTE:

我发现别名指令应该以 / 结尾,但仍然没有得到 =404 的功能和用途,因为状态仍然是 200ok

【问题讨论】:

【参考方案1】:

try_files 指令仅支持以下语法:

try_files file ... uri;
try_files file ... =code;

不支持:

try_files file ... uri =code;

fileuri 之间的区别在于,对于file 参数,NGINX 会在继续下一个参数之前检查它们的存在;对于uri,它不会。

如果最后一个参数的形式为=code,那么它之前的所有参数都是files(检查是否存在)。

由此,您可以得出结论,请求 URI /foo/bar 和此配置:

root /var/www;
location /foo/ 
  try_files $uri $uri/ =404;

...如果存在任何files,则不会触发404错误:

/var/www/foo/bar /var/www/foo/bar/ 目录(如果您启用了 autoindex/var/www/foo/bar/index.html(或index.php等)(由于index的值)

只有当以上都不存在时,NGINX 才会触发 404 错误。

【讨论】:

我检查了支持的语法,正如你所说,我可以用这种方式重写我的配置try_files $uri $uri/ $uri/index.html =404吗?【参考方案2】:

您应该定义服务器的根目录,然后是默认索引,然后将=404 添加到try_files

server 
  server_name example.com;
  root /var/www/html/example.com;
  index index.html index.htm index.php;
  # This is optional - if you want a customized 404 error page
  error_page 404 /404.html;

  location /subfolder 
    try_files $uri $uri/ =404;
  

rootalias 之间的区别在于root 附加location 以获取文件系统中的绝对路径,而alias 不包括location。因此,例如,当您尝试获取 http://example.com/subfolder/filename.txt

server_name example.com;
root /var/www/html/example;

location /subfolder 
  try_files $uri $uri/ =404;

将返回/var/www/html/example/subfolder/filename.txt(如果存在)的内容,而

server_name example.com;

location /subfolder 
  alias /var/log;
  try_files $uri $uri/ =404;

将返回/var/log/filename.txt的内容(如果存在)

【讨论】:

以上是关于nginx process = 404 如何在try_files中回退的主要内容,如果未能解决你的问题,请参考以下文章

nginx和tomcat做整合,nginx代理访问tomcat页面,一级页面能访问,但是二级页面提示404错误。

如何在 nginx 上使用 404 拒绝

如何使用 nginx 服务器处理 vuejs SPA 中的 404 错误请求

在Nginx下搭建wordpress时,最易出现404问题,如何解决

Nginx:404错误时返回301重定向

我nginx服务器设置了404,也能跳转到404但是返回状态码是200?请问如何解决