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.
-
按指定的file顺序查找存在的文件,并使用第一个找到的文件进行请求处理
-
查找路径是按照给定的root或alias为根路径来查找的
-
如果给出的file都没有匹配到,则重新请求最后一个参数给定的uri,就是新的location匹配
-
如果是格式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
是获取文件:
- 一般是通过第一个参数来获取文件。
- 要是第一个参数获取不到,将第二个参数作为目录,获取index配置的值。
- 要是第二个参数获取不到,将第三参数作为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的错误
- 请求地址:
http://localhost:8083/38/asas?a=1
- 首先寻找
/Users/xxx/Documents/38/asas
文件,获取不到。 - 寻找
/Users/xxx/Documents/38/asas
下的index.html文件,获取不到。 - 重新location地址
/38/asas/index.txt
会继续到达location
下,重新定位不到。
重新定位不到的话,会返回404异常。
3.1.3 返回500的错误
- 请求地址:
http://localhost:8083/38/asas?a=1
- 首先寻找
/Users/xxx/Documents/38/asas
文件,获取不到。 - 寻找
/Users/xxx/Documents/38/asas
下的index.html文件,获取不到。 - 重新location地址
/38/asas/index.txt
会继续到达location ~* ^/(273|38)/([^/]*)/
下。 - 首先寻找
/Users/xxx/Documents/38/asas/index.txt
,获取不到。 - 寻找
/Users/xxx/Documents/38/asas/index.txt
目录下的index文件,获取不到。 - 重新location地址
/38/asas/index.txt
会继续到达location ~* ^/(273|38)/([^/]*)/
下。
以上出现死循环,故nginx返回500。
网友评论