最近一个项目,遇到了Nginx反向代理和Cookie的问题,遇到的问题很杂,经过一周多逐步摸索,总算有个解决方案了,做个记号,主要是记录下遇到问题的过程,以便出现问题时备查。
【背景】

  1. 客户原有的使用Domino开发的Web应用系统,需要部分数据通过手机端展示;
  2. 原Domino系统只能通过内网访问,没有域名,内网的机器都需要修改hosts来解决域名问题;(至于为什么没有通过内网DNS进行域名解析设置,还不太清楚,不过这个对项目本身没有影响)

【问题及解决办法】

问题1:手机端需要从外网访问,没有域名,没有越狱或root的手机是不能修改hosts的,且Domino服务器必须通过域名访问。

解决方案:

  1. 增加一台服务器,安装Nginx作为反向代理,申请外网IP,并且通过PAT设置,通过外网访问到这台Nginx,Nginx负责将请求转发至目标服务器(Domino);
  2. 修改反向代理服务器的hosts,保证这台机器可以正常通过hosts中的域名访问Domino;
  3. 手机端可以通过IP访问反向代理即可,无需域名。

问题2:Domino中,链接中/符号引发的问题

由于Domino的技术特点,很多链接都是需要写上/的,如:src="/names.nsf?xxx",有的是页面中这样写的,也有的是通过302跳转时自动跳到这个位置,这一点与Java应用不同,Java应用中更多的是相对位置,不用写这个/。这个符号导致的问题如下:本来希望通过http://nginx_server/myapp/的方式来访问,将请求转发至http://domino_server/,这个需求可以通过在nginx.conf中这样设置解决:

location /myapp {proxy_pass http://domino_server/;
}

但是由于/的作用,导致直接访问到了http://nginx_server/,而不再通过/myapp,导致报页面内容找不到。
解决方案:
所以还需要在Nginx中,增加对/的反向代理:

location / {proxy_pass http://domino_server/;
}

问题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; // 8MBint cacheSizeDisk = 32 * 1024 * 1024; // 32MBNSURLCache* 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;
}

Nginx 反向代理及 Cookie 相关问题相关推荐

  1. uni-app——一种通过Nginx反向代理处理302重定向请求解决网络请求中无法获取Cookie的解决方案

    问题描述 小程序中不会自动保存和发送Cookie 使用插件(https://uniapp.dcloud.io/api/request/request)方法不能解决302重定向情况下获取Cookie 小 ...

  2. Nginx反向代理相关事宜

    第一章:Nginx概述 1.1.Nginx概述 Nginx("engine x")是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上Nginx的并发能力确 ...

  3. Nginx相关 解决nginx反向代理后页面上的js/css文件无法加载

    解决nginx反向代理后页面上的js/css文件无法加载 location ~ \.php$ {proxy_pass http://127.0.0.1:8000;include naproxy.con ...

  4. nginx反向代理缓存服务器构建

    博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 代理服务可简单的分为正向代理和反向代理: ...

  5. Nginx反向代理与负载均衡等配置文件示例

    Nginx反向代理于负载均衡等配置文件示例 Nginx.conf配置文件 worker_processes 8;events {worker_connections 1024; }http {incl ...

  6. Nginx 反向代理、负载均衡、页面缓存、URL重写、读写分离及简单双机热备详解...

    大纲 一.前言 二.环境准备 三.安装与配置Nginx  (windows下nginx安装.配置与使用) 四.Nginx之反向代理 五.Nginx之负载均衡  (负载均衡算法:nginx负载算法 up ...

  7. keepalived实现高可用nginx反向代理(Web集群)

    一.代理服务器概述 代理服务可简单的分为正向代理和反向代理: 1)正向代理: 用于代理内部网络对Internet的连接请求(如VPN/NAT),客户端指定代理服务器,并将本来要直接发送给目标Web服务 ...

  8. nginx反向代理加gitlab认证

    底层直接开辟了docker环境,结合opensumi得到一个持久化的在线编译环境(服务器ip地址+端口号,每个学生用不同的端口号),为了保证每个人的网址都只能自己用,需要在这个网址访问之前加上验证** ...

  9. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    标签:读写分离 页面缓存 URL重写 Nginx 反向代理 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://freeloda.bl ...

最新文章

  1. Neon Intrinsics各函数介绍
  2. hdu 1404/zoj 2725 Digital Deletions 博弈论
  3. 湖南工程学院计算机网络考试,湖南工程学院 计算机网络期末试卷试题
  4. Qt|C++-OpenGL绘制三角形带
  5. 集体智慧编程 - 优化
  6. C# 用委托实现Callback
  7. IOS 学习笔记 2015-03-24 OC-API-不可变字符串
  8. puppeteer-firefox 开启扩展
  9. 诺顿引起的系统频繁重启的解决方法重新
  10. Cadence系列之SIPI仿真笔记:Cadence多种版本的安装、卸载重装(一)
  11. android变化HOLO对话风格
  12. 如何用ps修改图片文字颜色
  13. 美团23届秋招全面启动!5000+机会,60+岗位,3次笔试机会!
  14. convexity and concavity(凸面和凹面)
  15. jsp微信二维码收款_java实现微信支付之扫码支付
  16. 赶时间发布 ChatGPT 竞品后,Google 遭员工反讽:太仓促、拙劣、非 Google Style
  17. 帆软加密狗注册配置安装步骤
  18. 垃圾回收之三色标记法
  19. 华为HCIE-Cloud Computing知识点整理—FusionCloud
  20. 来来来!关于iOS基础面试咱俩好好唠唠

热门文章

  1. java web中中文乱码问题汇总
  2. 摩托罗拉移动员裁员重点是研发
  3. Linux下用gSOAP开发Web Service服务端和客户端程序(一)
  4. 一个简单的shell实例
  5. 基于opengl的复杂图形三维建模实现
  6. Matlab mean() mean2() std() 函数的使用
  7. 通过完整示例来理解如何使用 epoll
  8. linux下/etc目录详解
  9. C++对中文字符的处理
  10. python 多图一窗口 打乱列表排序