http2.0反向代理遇到的坑

使用域名指向nginx服务来代理https,nginx可以通过分析clienthello中的server_name字段得到访问域名,然后通过解析域名地址来进行代理。

这里有几个问题,第一个是低版本的ie浏览器,使用的是低版本的tls,没有这个字段,无法得到域名,不过现在使用低版本IE的越来越少了,可以忽略。
第二个是苹果的某些系统应用,填写的域名不是真正的域名,不过有迹可循,可以通过字符串修改为真正的域名,进行代理。

最近测试京东的时候发现访问京东二级域名的时候偶尔会返回200,偶尔会301一个异常页面。

而如果新开浏览器打开二级页面,就没有这种问题。
偶尔发现如果不使用域名直接代理,而是使用浏览器代理设置,访问一切正常,非常奇怪。
通过对比发现,使用域名代理时使用的是HTTP2.0,而设置浏览器代理时使用的是HTTP1.1,于是在浏览器禁止http2.0(火狐设置 about:config network.http.spdy.enabled.http2为假/gg浏览器没找到怎么设置),访问京东一切正常。
客户端在请求的时候会携带自己支持的http类型

于是想到在代理时篡改字段,把http2.0给关掉,只申请http1.1,但是连接会被中断。
https://blog.csdn.net/mrpre/article/details/77868570
根据这个网页可以知道,虽然hello是明文的,但是也有校验,篡改是走不通的。
继续进一步抓包,发现在访问二级页面时,浏览器发出了几十个请求(不同域名),但是抓包只有一个链接,难道HTTP2.0会把不同域名同样IP的请求放在一个链接里面复用吗?所以导致了问题。
这里做了一些尝试,使用jiadian.jd.com的url访问www.jd.com 的ip地址。


我们发现刚好和浏览器出现的错误一样,都带了一个cdn_nohost。
基本可以确定HTTP2.0对于多个域名解析到同一个ip上的情况下,会复用连接,那么在这种情况下,简单的https代理就不开行了,只能针对一个域名给予一个ip的方法才能处理。

原文地址:https://blog.51cto.com/xzq2000/2447183

时间: 2024-10-18 23:45:24

http2.0反向代理遇到的坑的相关文章

[JavaEE]记录一下反向代理下SSO不能正常使用的一个坑

嗯...真的是很久没更新了,感觉有点瓶颈了,学又学不下去,工作要用的东西又没有难度,跳槽又没经验没学历关键是还不会吹也是尴尬... 无意间翻到这个博客,又是好久不更新突然想到了还有这个东西,就发一个最近做的小工具好了 主要是在做的某系统,客户哪里不愿意提供多端口,但是要部署多个应用和单点登录,于是就理所当然的用上了反向代理,然后就被公司内部的sso客户端给坑了... SSO单点登陆一般思路应该是这样: 重定向到单点登录服务器 -> 服务器登陆成功跳回并带上身份标识 -> 项目二次前往单点登陆服

用nginx做了一下反向代理,得到的ip地址都是127.0.0.1

nginx反向代理配置时,一般会添加下面的配置: proxy_set_header Host $host;      proxy_set_header X-Real-IP $remote_addr;      proxy_set_header REMOTE-HOST $remote_addr;      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; location / { proxy_pass http://127.0

HTTP2.0那些事

1. HTTP2.0的前世 http2.0的前世是http1.0和http1.1这两兄弟.虽然之前仅仅只有两个版本,但这两个版本所包含的协议规范之庞大,足以让任何一个有经验的工程师为之头疼.http1.0诞生于1996年,协议文档足足60页.之后第三年,http1.1也随之出生,协议文档膨胀到了176页.不过和我们手机端app升级不同的是,网络协议新版本并不会马上取代旧版本.实际上,1.0和1.1在之后很长的一段时间内一直并存,这是由于网络基础设施更新缓慢所决定的.今天的http2.0也是一样,

搞点事情,使用node搭建反向代理

导语 最近有个需求,需要对业务管理后台的操作记录进行上报.一般这种上报需求都是又后台同学来做比较合适的.但是因为后台人力的原因.这个工作落到了我这个小前端的头上.这里记录下做这个需求踩的一些坑. 一.实现反向代理 做为一个前端工程师,写代理脚本第一选择肯定是node.不过在此之前,要把请求代理到机器A上面的node服务上面.这里使用了tnginx.在nginx.config文件里面添加以下配置并重启.把cgi域名下的请求,代理到机器上面的8000端口node 服务. server{ listen

apache反向代理负载均衡请求至tomcat

实验环境 RHEL6.6-X86-64 软件 jdk-8u45-linux-x64.rpm apache-tomcat-8.0.23.tar.gz http-2.4.10 主机一:IP1: 192.168.1.10    IP2: 192.168.46.130  安装apache 主机二:192.168.46.128  TomcatA 主机三:192.168.46.129  TomcatB 拓扑图: 进入主机192.168.1.128 步骤一:安装JDK # rpm –ivh jdk-8u45-

腾讯云(ubuntu)下安装 nodejs + 实现 Nginx 反向代理

本文将介绍如何给腾讯云上的 Ubuntu Server 12.04 LTS 64位主机安装 node 及 nginx,并简单配置反向代理. 笔者在整个安装过程中遇到不少麻烦(不赘述),如果你希望少踩坑,可以按本文的步骤进行安装部署. 一. 新版 nodejs 安装 这里强烈推荐使用 nvm (Node版本管理器),其它方式的安装或多或少都有些问题. 具体步骤如下: 1. 通过 git 指令下载nvm 执行指令如下,我们把nvm下载到 /root/git/ 中去(记得要先安装 git): [[em

Nginx 配置 Jenkins 反向代理

安装 Nginx 参考之前的一篇文章 Nginx 安装配置 安装 Jenkins 参考之前的一篇文章 Linux 搭建 Jenkins Nginx 配置 Jenkins 的反向代理 # /etc/nginx/conf.d upstream jenkins { server 127.0.0.1:8080; } server { listen 80; server_name jenkins-pro.michael.com; charset utf-8; client_body_buffer_size

前端必备性能知识 - http2.0

前端开发中,性能是一定绕不开的,今天就来说一下前后台通信中最重要的一个通道--HTTP2.0 最开始的通讯协议叫http1.0,作为始祖级的它,定义了最基本的数据结构,请求头和请求体,以及每一个字段的含义,它顺应了当时的互联网需求,首次实现了浏览器与后端的交互,但它有一个时代烙印,就是短连接,每次请求就会建立一个TCP连接,三次握手四次挥手,用完就关闭,假如浏览器有300个请求,那么它就建立了300个连接,这样就给服务端带来的很大的压力,即使它只是一个很小很小的请求,后来,大家发现这样不行啊,内

Docker使用nginx-proxy对Nextcloud进行https反向代理

安装完Nextcloud之后,下一步就是启用https了.在不使用Docker的时候,一般都是去服务器(如apache)里面启用https功能并添加证书,但是我在 https://hub.docker.com/_/nextcloud 下面的介绍里面并没有发现相关的说明,相反那儿却给出了使用 ?nginx-proxy?和docker-letsencrypt-nginx-proxy-companion 进行反向代理的方式.这种方式使用nginx-proxy建立一个代理服务器,自动查询docker内部