使用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處理機制是否不同??

集合 和 元組的區別

·集合是包含若干元素的列表,元素無序且無重復元素
·元組是有序列表,元素不能修改

可變 有序
列表 ☑️ ☑️
元組 × ☑️
集合 ☑️ ×


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM