谷歌chrome瀏覽器ERR_SPDY_PROTOCOL_ERROR錯誤

前幾天老大忽然和我說以前的導出excel報表功能炸了,讓我看看,那我就看看唄,本地環境、測試環境都ok啊,怎麼一樣的代碼,到線上卻崩了呢,搞了一下午,本身差點奔潰,可是沒辦法,只能接着搞。html

來看看問題緣由:chrome

當你把網站遷移到性能更好的HTTP/2 協議時,可能會出現Chrome 無法加載頁面的問題,取而代之是一個顯示This site can’t be reached,以及錯誤信息爲ERR_SPDY_PROTOCOL_ERROR 的頁面。錯誤信息裏面沒有提到HTTP/2, 多是由於 HTTP/2 是從SPDY 協議發展而來,因此錯誤信息仍是老的SPDY。瀏覽器

原來咱們新線上環境剛升級爲HTTPS,因此能看到ERR_SPDY_PROTOCOL_ERROR 多是由於服務器發送了一個無效的HTTP header。Chrome 處理二進制的HTTP/2 協議時有一些嚴格,不會處理以空格代替破折號的header(例如用Referrer Policy 代替Referrer-Policy),也不會處理帶着2個冒號的header(例如Content-Security-Policy:: ...),因此檢查下你的header 是否準確。Firefox 會忽略這些無效的header,正常顯示頁面。服務器

繼續找問題:工具

訪問chrome://net-internals/#events(這連接無法點擊,只能複製而後粘貼到地址欄再訪問),在搜索框輸入你的域名(我以example.com爲例),而後在其餘標籤中打開出問題的網站。返回chrome://net-internals/#events ,選中Source Type 是HTTP2_SESSION 的行。性能

在右邊,能夠看到HTTP/2 協議的詳細信息,重點部分相似以下:測試

t=50413 [st=7]  HTTP2_SESSION_RECV_INVALID_HEADER
                --> header_name = "referrer policy"
                --> header_value = "same-origin"
t=50413 [st=7]  HTTP2_SESSION_SEND_RST_STREAM
               --> description = "Could not parse Spdy Control Frame Header."
               --> error_code = "1 (PROTOCOL_ERROR)"
               --> stream_id = 3

看到HTTP2_SESSION_RECV_INVALID_HEADER 那行了嗎?無效的header 就在它下面,在這個問題中,無效的header 是referrer policy,用空格代替了破折號。HTTP/2 協議理的header 名稱必須全小寫,若是你發送一個Referrer-Policy的header,瀏覽器會視爲referrer-policy網站

我所遇到的就是header裏多了個%20,也就是空格,這麼個空格在平時不會被解析,只有在chrome瀏覽器HTTPS協議下才會被如此嚴謹。。真是讓老夫頭疼啊。不過總算是解決了。spa

 

在你瀏覽器的chrome://net-internals/中,你能發現不少有趣的東西。這裏有一些不會出如今開發者工具中的請求,例如瀏覽器擴展發出的請求。excel

 

轉自:https://www.michalspacek.com/chrome-err_spdy_protocol_error-and-an-invalid-http-header