前幾天老大突然和我說之前的導出excel報表功能炸了,讓我看看,那我就看看唄,本地環境、測試環境都ok啊,怎麼同樣的代碼,到線上卻崩了呢,搞了一下午,自己差點奔潰,但是沒辦法,只能接着搞。
來看看問題原因:
當你把網站遷移到性能更好的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協議下才會被如此嚴謹。。真是讓老夫頭疼啊。不過總算是解決了。
在你瀏覽器的chrome://net-internals/
中,你能發現很多有趣的東西。這裏有一些不會出現在開發者工具中的請求,例如瀏覽器擴展發出的請求。
轉自:https://www.michalspacek.com/chrome-err_spdy_protocol_error-and-an-invalid-http-header