开发环境配置Nginx反向代理,中转服务请求。
前端使用React-Fetch 发起服务请求,移动端、Safari浏览器 丢失cookie信息。
前端的问题:
fetch默认不携带cookie
fetch发送请求默认是不发送cookie的,不管是同域还是跨域;那么问题就来了,对于那些需要权限验证的请求就可能无法正常获取数据,这时可以配置其
credentials项,其有3个值:
omit: 默认值,忽略cookie的发送same-origin: 表示cookie只能同域发送,不能跨域发送include: cookie既可以同域发送,也可以跨域发送
credentials所表达的含义,其实与XHR2中的withCredentials属性类似,表示请求是否携带cookie;具体可以参考阮一峰老师的跨域资源共享 CORS 详解中withCredentials一节的介绍; 这样,若要fetch请求携带cookie信息,只需设置一下credentials选项即可,例如fetch(url, {credentials: 'include'}); 另外补充一点:fetch默认对服务端通过
Set-Cookie头设置的cookie也会忽略,若想选择接受来自服务端的cookie信息,也必须要配置credentials选项;https://www.jianshu.com/p/65f03b0b1b6b Fetch 配置统一请求拦截,设置header请求头信息
Nginx服务器配置,支持会话cookie
nginx第三方模块—-nginx-sticky-module的使用(基于cookie的会话保持)
目前的项目网站架构中使用了F5和nginx,F5用来做负载均衡,nginx只用作反向代理服务器。最近应客户的要求准备去掉F5,使用软负载。大家都知道nginx抗并发能力强,又可以做负载均衡,而且使用nginx对我们目前的网站架构不会有大的变动,所以首选方案是nginx。但问题来了,nginx在会话保持这方面比较弱,用ip_hash做会话保持有很大的缺陷,它是通过客户端ip来实现,根据访问ip的hash结果分配请求到后端的app服务器,负载不会很均匀。之前在一个小项目前中使用过这种方法,已经得到验证。还有一个重要原因是我们的nginx不在最前端,所以只能放弃使用ip_hash。上网搜索了一番,知道了nginx-sticky-module这个第三方模块可以基于cookie实现会话保持,决定试试。
http://tengine.taobao.org/document_cn/http_upstream_session_sticky_cn.html
该模块是一个负载均衡模块,通过cookie实现客户端与后端服务器的会话保持, 在一定条件下可以保证同一个客户端访问的都是同一个后端服务器。
