nginx的proxy_pass之斜杠的作用

2016-04-25  秦天 

近期在配置nginx转发功能时。遇到一点小问题,在这里和大家分享一下

需求:

请求先打到加密墙get.sogou.com,解密后,判断如果host是ping.android.shouji.com且为log.gif的请求,则需要转发到另一台接收服务器。所以就需要在解密服务器上做一下判断转发:

重启nginx后运行了一下,发现真正hostserver收到了log.gif的转发请求,但是收到的请求是这样的:

正常请求是这样滴:

可以看到,手动拼的请求和原来的请求有了变化,这可能就是导致接收服务器收到数据异常的原因。继续挖~

网上查了一下,原来proxy_pass方法是可以将请求的参数,log.gif和postbody都带过去的,不需要手动拼。

于是改了一下nginx配置:

重新运行一下,再看接收服务器的log

不再有前面的?。请求正常了,接收服务器也可以正常接收了。

但是细想了一下,对于proxy_pass的转发原理还是有困惑:nginx怎么知道要讲log.gif及后面的所有字段都带过去?如果接收到的请求是http://server/A/B/C/log.gif,那么通过location ~ log.gif$匹配后,转发过去的是/A/B/C/log.gif及参数,还是log.gif及参数?决定实验一把试试。

 

测试网址:

http://10.129.156.137/A/B/C/background.html

1、在137服务器做如下配置:

访问网址后,233服务器接收到的请求为:

2、在137服务器做如下配置:

访问网址后,233服务器接收到的请求为:

通过实验,不管location匹配的是/A/、/B/、/C/、background.html$,最后转发到233服务器时的请求都为

这说明通过proxy_pass转发的是除了hostname之外所有的部分。

这样就有另外一个问题了,如果我们就想要background.html及后面的部分,怎么办呢?

网上查了一下,proxy_pass中的/就是用来解决这个问题的。继续尝试:

将137服务器做如下修改:

运行一下,发现nginx报错了:

根据提示,将正则规则去掉:

再运行就没有报错了。

访问以下请求,发现233服务器收不到转发请求了,说明没有命中这个location。细想了一下,原来这个location是没有正则匹配的,所以需要些完整匹配:

重新请求一下,发现233服务器收到的请求为:

从此可以得出结论:

Proxy_pass末尾带”/”和不带是有区别的:

不带斜杠转发的是除hostname以外的部分,包括目录。可以使用正则表达式匹配location,且任意正则匹配成功后,转发的都是完整目录路径。

带斜杠转发的是除hostname及目录外的所有部分。不能使用正则表达式匹配location块,只能使用完整路径名准确匹配。


{测试窝原创文章,作者:曹承臻}

作者简介:曹承臻,10届大学本科毕业,数学专业,6年软件测试行业经验

 

 

735°/7352 人阅读/0 条评论 发表评论

登录 后发表评论