跳到主要内容

nginx的代理问题

最近遇到一个问题,大致问题是需要在网站上调用其他地址的接口,而且是几乎全部的网站都要这样,所以很明显的问题就是跨域了,所以要解决跨域。这个问题在新一些的浏览器中很简单,后端配置下**Access-Control-Allow-Origin**就可以了,但是我们要兼容IE8浏览器,在这些浏览器中做跨域是比较复杂的,我找到了两个方案:

  1. 有一个jquery的插件,可以扩展xhr新增跨域的功能,这样简单很多;
  2. 用nginx配置,在请求的时候吧代理的地址传过去,然后用nginx的proxy_pass将其代理,这样就不回跨域了;

nginx的配置如下:

location ~/ {
# $args就是query的参数对象
# $arg_rebirthUrl 就是args对象里的rebirthUrl的值
# proxy_pass 指的是代理地址
if ($args ~* "rebirthUrl=") {
proxy_pass $arg_rebirthUrl;
}
}

大致意思就是判断query里有rebirthUrl这个参数那把请求代理到rebirthUrl的值里,比如:127.0.0.1:3000?a=1&b=2&rebirthUrl=127.0.0.2:8888就会获取rebirthUrl的值‘127.0.0.2:8888’作为代理,请求127.0.0.2:8888这个地址。

由于之前就是用的nginx做的代理,所以就顺着这个思路走下去了,一开始感觉都没什么问题,都能正确的请求到数据,但是仔细测试的时候发现get请求的query参数无法获取到,后来我在本地测试了一下,具体步骤是:

  1. 启动一个node后端用来接受请求;

  2. 启动一个前端项目;

  3. 启动一个nginx代理前端的项目,配置和线上类似;

  4. 然后发送请求,发现代理过来的数据query都不见了,只剩下光秃秃的rebirthUrl,但是post请求就不受影响;

    后来查了资料,发现post不受影响是因为post的请求体一般在body里,nginx可以正常转发,但是get请求的参数在query里,代理的时候只代理了URL,把后面的参数给忽略掉了,请求参数丢失,解决方案其实也很简单,因为$args就是请求的参数那就把它加上就好了

 location ~/ {
if ($args ~* "rebirthUrl=") {
proxy_pass $arg_rebirthUrl?$args; # 这个'?'不要丢了
}
}

至此代理nginx的方案就结束了

Loading Comments...