美文网首页
nginx(5)的try_file踩坑填坑日记

nginx(5)的try_file踩坑填坑日记

作者: 小胖学编程 | 来源:发表于2021-01-27 12:35 被阅读0次

    1. 官网解读

    try_files是nginx中http_core核心模块所带的指令,主要是能替代一些rewrite的指令,提高解析效率。官网的文档为http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files

    try_files的语法规则:

    格式1:try_files file ... uri; 格式2:try_files file ... =code;

    可应用的上下文:server,location段。

    try_files语法解释:

    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.

    1. 按指定的file顺序查找存在的文件,并使用第一个找到的文件进行请求处理

    2. 查找路径是按照给定的root或alias为根路径来查找的

    3. 如果给出的file都没有匹配到,则重新请求最后一个参数给定的uri,就是新的location匹配

    4. 如果是格式2,如果最后一个参数是 = 404 ,若给出的file都没有匹配到,则最后返回404的响应码

    2. 实际运用

    location ~* ^/(273|38)/([^/]*)/ {
            root /Users/xxx/Documents/;
            index index.html index.htm;
            try_files $uri $uri/ /$1/$2/index.txt;
    }
    

    2.1. 什么是uri

    http://localhost:8090/test?a=1 的uri是/test

    http://localhost:8090/test/asas?a=1的uri是/test/asas

    http://localhost:8090/test/asas的uri是/test/asas

    http://localhost:8090/38/index.txt的uri是/38/index.txt

    2.2 属性含义

    try_files是获取文件:

    1. 一般是通过第一个参数来获取文件。
    2. 要是第一个参数获取不到,将第二个参数作为目录,获取index配置的值。
    3. 要是第二个参数获取不到,将第三参数作为location的值,然后内部重定向,再次定位到location中,若是再次定位的location依旧获取不到,那么返回500错误。

    3. 遇到的坑

    3.1.1. 返回404的错误

    请求地址:http://localhost:8083/38/asas?a=1

    因为location的规则是location ~* ^/(273|38)/([^/]*)/,找不到对应的location。

    解决方案:修改规则:location ~* ^/(273|38)/([^/]*)

    3.1.2 重定向返回404的错误

    1. 请求地址:http://localhost:8083/38/asas?a=1
    2. 首先寻找/Users/xxx/Documents/38/asas文件,获取不到。
    3. 寻找/Users/xxx/Documents/38/asas下的index.html文件,获取不到。
    4. 重新location地址/38/asas/index.txt会继续到达location下,重新定位不到。

    重新定位不到的话,会返回404异常。

    3.1.3 返回500的错误

    1. 请求地址:http://localhost:8083/38/asas?a=1
    2. 首先寻找/Users/xxx/Documents/38/asas文件,获取不到。
    3. 寻找/Users/xxx/Documents/38/asas下的index.html文件,获取不到。
    4. 重新location地址/38/asas/index.txt会继续到达location ~* ^/(273|38)/([^/]*)/下。
    5. 首先寻找/Users/xxx/Documents/38/asas/index.txt,获取不到。
    6. 寻找/Users/xxx/Documents/38/asas/index.txt目录下的index文件,获取不到。
    7. 重新location地址/38/asas/index.txt会继续到达location ~* ^/(273|38)/([^/]*)/下。

    以上出现死循环,故nginx返回500。

    相关文章

      网友评论

          本文标题:nginx(5)的try_file踩坑填坑日记

          本文链接:https://www.haomeiwen.com/subject/oyiozktx.html