【问题标题】:How nginx process =404 fallback in try_filesnginx process = 404 如何在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

【问题讨论】:

    标签: nginx nginx-location


    【解决方案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的内容(如果存在)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 2019-03-15
      • 1970-01-01
      • 2019-02-09
      相关资源
      最近更新 更多