web 部署专题(八):Nginx 反向代理中cookie相关问题
问题3:认证问题
Domino服务器中,通过写了一些接口代码,提供RESTful的服务,来对手机端进行提供服务。但是由于原来的环境,没有SSO,而且不通过认证,没法访问到Domino里面的接口代码。
解决方案:
手机端通过HTTP,模拟登录过程
问题4:“问题3”的解决方案,由于经过了反向代理,导致Domino的Response中Cookie的Domain属性,与反向代理的域名不一致,Cookie的Domain属性,仍然是Domino服务器的域名。手机端拿到Cookie之后,再次进行请求的话,请求是发往反向代理的,浏览器认为之前拿到的Cookie不属于反向代理,所以Request的时候,不会把Cookie带上,导致认证不能通过。
解决方案:
location / {
proxy_cookie_domain domino_server nginx_server;
}
在Nginx上这样设置后,可以让反向代理修改Cookie的Domain属性。
问题5:“问题4”的解决方案,适合反向代理服务器有域名的情况,对于没有域名的情况,虽然浏览器收到的Response中有正确的Cookie信息(从Chrom开发工具的Network页签查看,包括域名也已经经过转换成反向代理的域名),但是浏览器却没能正常保存这个Cookie(从Chrom开发工具的Application页签查看Cookie)。这一点比较奇怪,Java写的程序,通过反向代理后,不论反向代理是IP还是域名,浏览器端都可以正常拿到Cookie并保存,具体原因还没搞清。不知是否Domino服务器是否有什么特别的安全设置。
解决方案:
在Domino服务器所在的内网,增加另一台Java服务器,经过反向代理的请求,先发给这台Java服务器,由这台Java服务器将Request转发至Domino,收到Domino的Response之后,抽取Cookie,并进行设置,以保证返回给浏览器的Cookie能被保存。
至此,服务器部分问题解决。
补充说明:
“问题5”中,开始的解决方案,是Java服务器将拿到的Cookie通过Response的Body返回,由页面JS将Cookie写入。但是这种方案,当页面位于服务端时有效(跨域一样有效),但是对于通过Electron打包的本地页面,JS无法将Cookie正常写入,这一点也暂时原因不明,不知道是否是由于浏览器认为本地页面写的Cookie与服务端跨域?对于本地页面,还是需要服务端在Response中正常返回Cookie。
问题6:iOS版集成Cordova后,通过本地页面访问服务器,收到的Cookie不能正常保存,但是直接使用Cordova打包是可以的。
解决方案:
发现Cordova直接打包的应用,AppDelegate继承自原来的CDVAppDelegate,这个类初始化时执行了:
NSHTTPCookieStorage* cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
[cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
int cacheSizeMemory = 8 * 1024 * 1024; // 8MB
int cacheSizeDisk = 32 * 1024 * 1024; // 32MB
NSURLCache* sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
[NSURLCache setSharedURLCache:sharedCache];
将这部分代码加入自己应用的初始化部分即可。
nginx.conf 完整配置
location /myapp {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
proxy_pass http://domino.server/;
proxy_cookie_domain domino.server nginx.server;
proxy_redirect off;
}
作者:舌尖上的大胖
链接:https://www.jianshu.com/p/aeed2a56a3eb
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
web 部署专题(八):Nginx 反向代理中cookie相关问题的更多相关文章
- nginx反向代理中proxy_set_header 运维笔记
Nginx proxy_set_header:即允许重新定义或添加字段传递给代理服务器的请求头.该值可以包含文本.变量和它们的组合.在没有定义proxy_set_header时会继承之前定义的值.默认 ...
- 使用Nginx反向代理和proxy_cache缓存搭建CDN服务器加快Web访问速度
碰到问题:移动用户访问web服务器www.osyunwei.com很慢解决办法:1.在移动机房放置一台nginx反向代理服务器2.通过域名DNS智能解析,所有移动用户访问www.osyunwei.co ...
- nginx高性能WEB服务器系列之七--nginx反向代理
nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...
- Tomcat多个项目部署,通过Nginx反向代理分别配置二级域名的流程
购买域名.示例:example.com 设置多个二级域名.如图: 配置tomcat文件: 修改tomcat/conf目录下的server.xml文件: 如下配置配置了3个容器,使用三个不同的端口. 请 ...
- 07 nginx反向代理和nfs服务
作业一:nginx服务二进制安装nginx包 作为web服务修改配置文件 让配置生效,验证配置 作业二:nfs服务二进制安装nfs作为共享存储挂载在三台web的网站根目录下实现,在任意一台web上修改 ...
- Nginx反向代理和Node.js后端解决跨域问题
最近在写自己的博客,涉及到跨域的问题,自己捣鼓许久,终于解决了.然后总结一下,记录一下,日后遇到类似的问题的时候也可以得到一些启发. 一.什么是跨域 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏 ...
- nginx反向代理和tomcat集群(适用于ubutnu16.04及其centos7)
下面示例,本人亲测有效 为什么要反向代理和集群? 因为并发问题,很多请求如果全部分发给一个tomcat,一个tomcat优化最好的话,据说可达到800负载,但是面对成千上万的请求,单单一个tomcat ...
- web 部署专题(六):nginx 安装(二) linux
https://www.cnblogs.com/quzq/p/12131696.html 基础篇 一.环境 服务器版本:CentOS 7.2 为了保证学习阶段不遇到奇怪的事情,请保证以下四点(大神选择 ...
- web 部署专题(五):nginx 安装(一) 树莓派
1.安装Nginx sudo apt-get install nginx 2.启动Nginx sudo /etc/init.d/nginx start 3.测试安装是否成功(nginx默认是80端口) ...
随机推荐
- thinkphp5.0使用官方验证码插件
1.首先使用Composer下载验证码插件. 安装完成后,使用以下命令修改composer配置文件,使用国内镜像.原因你懂的. composer config -g repo.packagist co ...
- 【经验心得】谈一谈我IT行业未来的方向
随着科技的发展,越来越多的入门行业将被淘汰,其实淘汰的不仅仅是工厂.环卫工人.普工这些无技术含量的工作,有一些运维.编辑等低门槛的行业也将被淘汰,这也是我这两年看互联网发展趋势得出来的结论,人类要想发 ...
- pyqt5 主界面打开新主界面的实现
import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * ###### ...
- 04 . Docker安全与Docker底层实现
Docker安全 Docker安全性时,主要考虑三个方面 # 1. 由内核的名字空间和控制组机制提供的容器内在安全 # 2. Docker程序(特别是服务端)本身的抗攻击性 # 3. 内核安全性的加强 ...
- List作为泛型参数实现可接收存储任意类型的List对象
原文链接:https://blog.csdn.net/eeeeasy/article/details/80999650?utm_source=blogxgwz2 在项目中遇到一个问题,想要封装一个通用 ...
- elasticsearch unassigned shards 导致RED解决
先通过命令查看节点的shard分配整体情况 curl -X GET "ip:9200/_cat/allocation?v" 说明:有16个索引未分片 2.查看未分片的索引 curl ...
- 【大厂面试08期】谈一谈你对HashMap的理解?
摘要 HashMap的原理也是大厂面试中经常会涉及的问题,同时也是工作中常用到的Java容器,本文主要通过对以下问题进行分析讲解,来帮助大家理解HashMap的原理. 1.HashMap添加一个键值对 ...
- C++ 公有继承、保护继承和私有继承的对比
在c++的继承控制中,有三种不同的控制权限,分别是public.protected和private.定义派生类时,若不显示加上这三个关键字,就会使用默认的方式,用struct定义的类是默认public ...
- android异步任务asyncTask详细分析
android中的耗时操作需要放在子线程中去执行 asynctask是对Handler和和线程池的封装,直接使用比THread效率更加的高效因为封装了线程池,比我们每次直接new Thread效率更高 ...
- SpringBoot--数据库管理与迁移(LiquiBase)
随着开发时间积累,一个项目会越来越大,同时表结构也越来越多,管理起来比较复杂,特别是当想要把一个答的项目拆分成多个小项目时,表结构拆分会耗很大的精力:如果使用LiquiBase对数据库进行管理,那么就 ...