Skip to content

nginx中try_file简单说明

前段时间使用vitepress出现过一个问题: 部署的时候需要去掉后缀.html,已经在vitepress配置文件中设置了,但当部署到nginx上时,如果是中文路径,刷新页面会导致404,nginx经过try_file调教后解决问题。

原因比较简单:

  • 部署之后html资源文件是.html结尾的
  • 如果当前页面不是单页面跳转的,直接访问无html得路径时,无法映射到对应的文件

nginx配置修改如下:

c
 location / {        
        # vitepress 配置的访问的没有.html,这里参考了 https://www.cnblogs.com/taozhengquan/p/15262636.html
        try_files $uri $uri/ $uri.html /index.html?$args;
}
 location / {        
        # vitepress 配置的访问的没有.html,这里参考了 https://www.cnblogs.com/taozhengquan/p/15262636.html
        try_files $uri $uri/ $uri.html /index.html?$args;
}

关于try_file的说明:

Module ngx_http_core_module
Checks the existence of files in the specified order and uses the first found file for request processing; the processing is performed in the current context. The path to a file is constructed from the _file_ parameter according to the root and alias directives. It is possible to check directory’s existence by specifying a slash at the end of a name, e.g. “$uri/”. If none of the files were found, an internal redirect to the _uri_ specified in the last parameter is made.
按顺序检查文件是否存在,如果不存在就重定向最后一个参数

例如

c
location /images/ {
    root /pics/;
    try_files $uri /images/default.gif;
}

location = /images/default.gif {
    expires 30s;
}
location /images/ {
    root /pics/;
    try_files $uri /images/default.gif;
}

location = /images/default.gif {
    expires 30s;
}

当请求 127.0.0.1/images/xxx.png 会依次查找

  • 1.文件/pics/xxx.png
    1. 找不到会请求127.0.0.1/images/default.gif

try_files 的作用是按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。

需要注意的是,只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部 URI 的指向。最后一个参数是回退 URI 且必须存在,否则会出现内部 500 错误。命名的 location 也可以使用在最后一个参数中。与 rewrite 指令不同,如果回退 URI 不是命名的 location 那么 $args 不会自动保留,如果你想保留 $args,则必须明确声明。