天天看点

nginx rewrite学习

nginx rewrite学习

今天,一个后端同事找到我说,为什么他vue本地可以运行,结果到了线上确不行了。我一听到这个情况,那肯定就是nginx配置的问题了。奈何后端同事对nginx不是那么了解,于是让我找运维合作解决一下。我于是找到了运维要到了nginx的配置文件查看,看看到底是那儿的问题,毕竟之前自己有过手动搭建过nginx服务器的经验,对于一般的nginx配置还是了解的。同事的问题一看就是代理配置的有问题,才导致的线上访问报错的。结果拿到配置文件左看看右看看硬是没看出来是那儿的问题。后面对比了一下本地的proxy配置,pathRewrite这个玩意进入了视线中,我项目中正常都是以后端接口的前两个英文单词进行代理的,比如后端的接口为 https://www.xxx.com.cn/aa/bb/cc/dd/getUserInfo  我的习惯是以/aa/bb/进行关键字进行代理的。

实际上下面的这种写法也是可以的。但是因为之前都是配置成功的于是就没有深入了解这边的配置问题。

 也就是pathRewrite 这个玩意到底是干啥子用的。没有具体的去了解过。

今天后端同事的操作让我对于这个pathRewrite有了一些了解。

后端同事的本地配置没有毛病

 然后上线的时候找运维配置对应的ng配置,运维就按照我们之前的那种规则配置了,结果就发现有问题了,访问不通了。

 运维把脚本给我之后。我左看看右看看没看出啥子问题,然后尝试请求了看一下。发现请求也是正常的。然后瞄了一眼,代理之后的真实的请求,发现请求中多了login导致整个接口调用失败,于是就在考虑为什么本地请求中没有夹带login,线上确夹带了login。是不是那儿有操作重新写了啥的,在看到pathRewrite,这个从英文看就有点可疑,于是搜索了一下,发现确实是这个重写了login,把匹配的到的login重写成了“”,这样的话那么请求中就不会存在login这个字段了。这样的话就简单了,只要把ng服务器上面的请求也重新写一下就行了,查了一下,ng上面的rewrite重写是通过正则匹配实现的,

rewrite "用来匹配路径的正则" 重写后的路径 [指令];

常用的指令有2个,分别是:last、break;

(1)last:重写路径结束后,将得到的路径重新进行一次路径匹配;

(2)break:重写路径结束后,不再重新匹配路径。

因为对正则不熟悉,写了三次才写正确了。

rewrite "^/login/(.*)$" /$1 break;

首先是匹配到login开头的。然后只取匹配到的后面的部分,这样就实现去掉请求路径中的login字符串了。

上一篇: 车世界

继续阅读