今天看了nginx的这两个线上配置,有点忘记了,查了一些资料,然后梳理了一下,这里做一个记录,原来的配置大约如下(做了简化)
location /test {
client_max_body_size 1024M;
rewrite /test/(.*) /test/abc/$1?$args break;
try_files $uri $uri/ @proxy;
}
location @proxy {
xxxx
}
这里有一个rewrite和try_files, 假设请求是: https://xxx/test/cat.jpg?userid=user1&auth=123
匹配到/test,
1.rewrite.
rewrite的作用就是把路径重写一下,重写后的请求为: https://xxx/test/abc/cat.jpg?userid=user1&auth=123
相比原路径,多加了一个子路径abc/。 注意后面的那个break,如果没有这个break,会一直死循环,因为rewrite后的路径,还是会匹配到/test这里来,再加一次路径就变成 https://xxx/test/abc/abc/cat.jpg?userid=user1&auth=123, 又加了一层子路径abc/,这个break的意思就是,不会重新匹配 location,而是往下执行try_files $uri $uri/ @proxy这条语句。
2.try_files
接下来执行try_files $uri $uri/ @proxy, try_file是尝试读取文件,
比如上面的:https://xxx/test/abc/cat.jpg?userid=user1&auth=123
按顺序匹配,首先尝试读取$uri,这里的uri是指/test/abc/cat.jpg,尝试去当前工作目录下的/test/abc/目录读取这个cat.jpg的静态文件,
发现没有,就去匹配第2个$uri/ 是目录,即尝试去当前工作目录下的/test/abc/cat.jpg/这个目录,我们这里是要访问文件,所以我们不会创建这个目录,所以第2个匹配不上,然后去试第3个,第3个是一个@proxy,@是内部跳转的意思,那么就进行内部跳转到location名为@proxy那里进行处理。
参考:
https://segmentfault.com/q/1010000008485856
https://blog.csdn.net/qq_40584960/article/details/86081123