nginx rewrite 和 try_files的配置

本文记录了Nginx中rewrite和try_files的配置用法。rewrite用于重写URL,防止循环重写需使用break。try_files则按顺序尝试查找文件或执行内部跳转。当尝试读取/test/abc/cat.jpg失败后,会进行内部跳转到@proxy进行后续处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天看了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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值