后台的东西是这样的。公司之前开发过一个系统,但是因为国家政策原因下线了。时隔两年,现在又可以上线了,只是没有代码和相关环境的配置。再次上线的过程中遇到了无法登录系统的问题,这个系统架构如下:nginx作为web访问层,数据处理会反向代理到运行的java服务上在雄猫上。一开始怀疑是不是代码逻辑有问题,后来开发说代码没问题。为此,开发也跳过了nginx获取数据请求,直接丢给了tomcat,结果果然没问题。但是在实际生产中,不能这样运行,因为会暴露处理数据的Tomcat。所以只能在nginx这里找问题。故障处理过程中的现象是这样的。登录时,会成功进入系统,但会立即跳回登录页面。登录过程中会有一个post请求将登录信息上传到系统,还有一个get请求获取登录状态,但是不知道获取登录状态的逻辑是什么,判断是什么条件,我想让开发者看代码逻辑是的,但是开发看不出为什么。然后我查看帖子的标题信息并获取请求。header信息如下:post请求header信息和get请求header的区别。但是光看这两个header信息也看不出有什么异常,于是要求开发改代码直接跳过nginx能登录的情况,想对比下nginx能登录的情况有什么不同可以登录和不能登录的情况。下面是可以登录的情况下的header信息:ps:请忽略Access-Control相关的header信息的区别,后面加入解决跨域),就是不能登录的时候,post和get请求都有set-cookie,但是可以登录的时候在,只有post请求有set-cookie。所以我猜测post请求登录成功后会生成cookie,然后get请求读取cookie,cookie就是登录状态。于是又对比了两种情况的cookies。但是在看cookie的具体情况之前,我想先弄清楚两种情况下请求的区别。如果登录不上,使用nginx做反向代理,http://域名/字符串/XXX会被反向代理为http://域名:端口/项目名/XXX,即替换带有项目名称字符串的固定字符(据说这样做是为了区分测试环境和生产环境),然后就可以不经过nginx代理直接登录,直接请求http://域名:端口/项目名称/XXX.因为cookie中涉及到这些,所以有必要先说清楚。以下是cookie的具体信息。如果不能登录,post请求cookie信息不能登录。如果不能登录,get请求cookie信息可以登录。如果可以登录,post请求cookie信息可以登录。如果你可以登录,可以看到get请求的cookie信息,可以登录。在这种情况下,确实是get请求请求了post请求响应的cookie。那么为什么在nginx之后,get请求没有通过这种方式获取到postresponse的cookie呢?我搜索关键字'nginxcookie',看到《解决nginx proxy_pass反向代理cookie,session丢失的问题》,得知cookie_path必须匹配请求的url才能获取cookie,这样我就无法登录的问题得到一个合理的解释:当post请求http://域名/string/XXX,通过nginx反向代理到http://域名:端口/项目名/XXX,此时cookie_path在项目名下(可以从post中看到requestheader),然后获取请求http://域名/String/YYY,但是这个请求中没有项目名,无法获取响应上述post请求放置在项目名目录下的cookie,所以判断为未登录,返回登录页面,同时生成get请求,在项目名目录下放置cookie。问题解决第一种方案:修改cookie_path,nginx提供proxy_cookie_path命令修改cookie_path,用法:proxy_cookie_path原地址修改地址官网传送门经测试,修改地址只要满足请求url域名后目录最左匹配规则即可都是可以的,比如我的请求是http://域名/a/b/c/d/xxx,反向代理到http://域名:端口/E/b/c/d/xxx,那么cookie_path修改地址可以设置为/,/a,/a/b,/a/b/c,/a/b/c/d,例子:location/a/{proxy_passhttp://127.0.0.1:8080/E/;proxy_cookie_path/E/a;}方案二:修改请求地址,使请求地址匹配反向代理地址,如请求地址http://域名/string/XXX被反向代理为http://domainname:port/projectname/XXX,那么可以修改请求地址为http://domainname/projectname/XXX,这样就不需要配置proxy_cookie_path了。参考:解决nginxproxy_pass反向代理cookie和session丢失问题