nginx rewrite导致的会话问题

                               创建:2022年5月25日 更新:2022年5月31日 131点热度 0人点赞 0条评论

异常问题之重新登录

某项目反馈编辑报表页面点击任意按钮会弹出重新登录,很是怪异。

排查

通过浏览器确定了复现问题时候ng的会话变了,那么可以知道后续转发到tomcat就会有新会话,导致重新登录

  • 首先排查了ng配置,没有发现跳转到新tomcat的相关内容,主要是故障漂移等没有触发,那么会话变化不是这里影响
  • ng开启了upsteam的日志,发现在复现操作的时候有一个跳转,之后upstream地址都变了,于是找到前后相关的请求,并且在浏览器的请求中对比,发现某个请求的上下文路径掉了,于是有了以下解释:

    正常情况下,ng的会话是带了上下文路径的,但是这里某个请求没有路径,导致请求到达ng之后会通过rewrite重写来重新定位到此路径上,于是就返回了一个新的会话id,并且分配一个新的tomcat,最终ng会话,tomcat会话都变了,需要重新登录

有了这个推论,那么解决的话只需要开发把这个路径丢失的路径补上就好了。但是和开发交流的过程中发现了另外一个问题,不管是路径丢失还是什么其他错误请求,是不应该覆盖我当前会话的,在这个问题中,用户没有登出的情况下,最终浏览器的会话被覆盖,这也是一个不能接受的问题!于是通过排查浏览器跳转,发现当浏览器给出任意错误路径,请求中是没有cookie,但是响应给出的cookie有异常,如下:

请求的路径不是我们所需的xnzhjtcx,但是cookie却给他设置了值,导致覆盖。根据结果猜测过程,说明此请求是到达了tomcat,才返回路径和cookie,所以当前ng所做的操作可能包括:本地重写了地址,然后发往后端,但用原地址返回。在发往后端的时候发现没有cookie,认为是新请求。
附重写过程中的302:

附ng配置:

server {
    ...
    if ( $request_uri !~ ^/(xnzhjtcx/.*|xnzhjtcx$) ) {
        rewrite ^ /xnzhjtcx;
    }
    location /xnzhjtcx {
        proxy_pass http://lb;
    }
}

如何解决

要解决上面任意地址导致cookie覆盖的问题,既然是重写导致,那就需要从这里解决,尝试了如下方案:

  1. 在rewrite后面写带根的路径,请求没有cookie,响应设置了路径和cookie,但浏览器没有显示重定向(结果不行)


    附ng配置:

    # 比较奇怪的是此rewrite之后浏览器返回的是200,而不是30x
    server {
    ...
    if ( $request_uri !~ ^/(xnzhjtcx/.*|xnzhjtcx$) ) {
        rewrite ^ /xnzhjtcx/;
    }
    location /xnzhjtcx {
        proxy_pass http://lb;
    }
    }
  2. rewirte后面接绝对地址,请求没有cookie,响应没有返回cookie(结果可以)

    附ng配置:

    # 此配置返回30x但没有任何cookie
    server {
    ...
    if ( $request_uri !~ ^/(xnzhjtcx/.*|xnzhjtcx$) ) {
        rewrite ^ http://61.242.140.32:9100/xnzhjtcx/;
    }
    location /xnzhjtcx {
        proxy_pass http://lb;
    }
    }
  3. 使用location来配合重写,请求没有cookie,响应没有cookie(结果可以)
    附ng配置:

    location / {
     rewrite ^ /XTJG/ permanent;
    }
  • 疑问:
    1. 重写只接路径返回了302和cookie,中间经历了什么
    2. 基于上面重写路径后面加了根截止返回了200和cookie,中间经历了什么
    3. 重写路径修改为ip+port+路径,返回了302,中间经历了什么

其他问题

最后,不管重写的时候是相对地址还是绝对地址,如果重写的时候不以根结束,但是请求是目录,这样会多跳转一次,修改为根结束,可看下图效果:

修改后可以看到重定向少一次

yuc

这个人很懒,什么都没留下

error: Content is protected !!