我是靠谱客的博主 雪白网络,最近开发中收集的这篇文章主要介绍Nginx 多if条件判断下的URI重写,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

关于Nginx URI重写的文章很多,基本都是用rewrite命令 把匹配的URI换成要重写的即可,然后后面跟上last 或者break之类的,比较直接。这里要分享的场景是多重if条件判断并且重写的URI部分是来自原有的URI。

 

背景是这样的,我有两个服务A和B,当请求A的URI里包含参数collectSource=true并且是POST请求的时候,将原有的URI /i18n/api/xxxx?collectSource=true变成/i18n/source/api/xxxx?collectSource=true然后发到服务B端。

这里将collectSource=true和POST请求这两个条件分散在两个location 匹配里面。当第一个if条件匹配了collectSource=true,那么重写URI,在i18n后面加上了source这个路径,并且用了last来继续匹配location,然后就匹配到了第二个location,进入第二个if判断,如果请求方法是POST,那么直接用proxy_pass来代理到服务B上,如果不是POST,那么恢复原有的URI(也就是不带source这个路径)。

这里proxy_pass命令要特别注意,因为最后面加或者不加‘/’是有很大区别的。我在第二个if判断里面没有使用'/',那么它其实就是一个相对的路径,也就是https://serverA:8090后面加上location匹配的内容/i18n/source/xxxx,写全了就是https://serverA:8090/i18n/source/api/xxxx?collectSource=true。而在最后一个proxy_pass中,是加了'/'的,表示的是绝对的路径,也就是https://serverA:8090/i18n/后面加上location匹配条件的/i18n/source/之后的路径,并不包含/i18n/source/,这样就恢复的原本的URI路径即https://serverA:8090/i18n/api/xxxx?collectSource=true。

最后一个要注意的问题就是,在重写POST请求的URI时候,如果rewrite后面跟着的是http或者https开头的路径,那么你的POST请求是会变成GET的,请求体里的数据就丢失了,所以这里采用的是proxy_pass这种方式。

      location / {
            ...
            ...
            if ( $args ~* ^(.*)collectSource=trueb(.*)$ ){
                 rewrite /i18n/(.*) /i18n/source/$1 last;
            }
            proxy_pass https://serverA:8090;
       }

       location /i18n/source/ {
            if ( $request_method = POST ){
                 proxy_pass  https://serverB:8088;
            }
            proxy_pass https://serverA:8090/i18n/;
       }

 

最后

以上就是雪白网络为你收集整理的Nginx 多if条件判断下的URI重写的全部内容,希望文章能够帮你解决Nginx 多if条件判断下的URI重写所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部