使用Chrome访问https网站时报错 【net::ERR_HTTP2_PROTOCOL_ERROR 200】
该问题已解决
问题描述:
内部调试和验收环境用http协议,stg,生产环境用https协议;
stg和生产环境上Flask项目在没有修改代码的情况下重启后偶尔会出现访问异常的情况(内部调试和验收环境不存在)。
异常时访问接口,Flask日志正常,Nginx日志也正常。
IE,火狐均可正常访问到,唯独谷歌浏览器访问报错:
(falied) net::ERR_HTTP2_PROTOCOL_ERROR
部署环境:
centos
通过docker部署python flask项目;
容器 : Nginx,Flask项目,Redis,Mysql;
stg,生产环境用https协议;
内部调试和验收环境用http协议。
网上搜索了解到可能存在的问题
1.nginx反向代理;
2.谷歌浏览器本身问题;
3.http版本定义问题;
1.nginx反向代理问题
网上查询可能问题如下:
proxy_max_temp_file_size:这是每个请求能用磁盘上临时文件最大大小。这些当上游响应太大不能装配到缓冲区时被创建。
但是我的nginx配置本身是有这项的,故排除这个原因:
2.谷歌浏览器本身问题
没能认证
3.修改后端Nginx的http版本
注:nginx默认版本是1.1。指定为2.0版本
响应变成502
502 Bad Gateway是指错误网关,无效网关;在互联网中表示一种网络错误。表现在WEB浏览器中给出的页面反馈。
含义:这通常并不意味着上游服务器已关闭(无响应网关/代理) ,而是上游服务器和网关/代理使用不一致的协议交换数据。
鉴于互联网协议是相当清楚的,它往往意味着一个或两个机器已不正确或不完全编程。
以上处理方式都未能解决问题
问题解决思路如下:
1.查看正常和异常情况下火狐浏览器的response返回数据是否存在差异。
谷歌异常情况下,火狐的访问返回:
谷歌正常访问情况下,火狐的访问返回:
观察到:返回头中content-type:的值不同。
2.抓包
response header出现非法字符:illegal characters found in header name
application/json:Content-Type 被对调导致
3.查看代码
代码重构后的response返回是:[{\’Content-Type\’, \’application/json\’}]
而继承类中的数据类型是:[(“Content-Type”, “text/html; charset=utf-8”)]
找到原因:重构的类型定义成了集合类型,集合的特点是无序无重复,因为无序,所以再每次重启服务时,取值都会随机取,导致前后顺序颠倒。谷歌访问报错。
从中发现火狐,IE和谷歌对https response返回的处理机制不同,导致响应头部错误时,火狐和IE将错误放弃,设为初始值。而谷歌直接抛出错误。
http和https处理机制是否不同??
集合 和 元组的区别
·集合是包含若干元素的列表,元素无序且无重复元素
·元组是有序列表,元素不能修改
可变 | 有序 | |
---|---|---|
列表 | ☑️ | ☑️ |
元组 | × | ☑️ |
集合 | ☑️ | × |