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;
file
和uri
之间的区别在于,对于file
参数,NGINX 会在继续下一个参数之前检查它们的存在;对于uri
,它不会。
如果最后一个参数的形式为=code
,那么它之前的所有参数都是file
s(检查是否存在)。
由此,您可以得出结论,请求 URI /foo/bar
和此配置:
root /var/www;
location /foo/
try_files $uri $uri/ =404;
...如果存在任何file
s,则不会触发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;
root
和alias
之间的区别在于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 服务器处理 vuejs SPA 中的 404 错误请求