⾕歌chrome浏览器ERR_SPDY_PROTOCOL_ERROR错误前⼏天⽼⼤突然和我说之前的导出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,正常显⽰页⾯。
parse error怎么解决继续问题:
访问chrome://net-internals/#events(这链接没法点击,只能复制然后粘贴到地址栏再访问),在搜索框输⼊你的域名(我以example为例),然后在其他标签中打开出问题的⽹站。返回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/中,你能发现很多有趣的东西。这⾥有⼀些不会出现在开发者⼯具中的请求,例如浏览器扩展发出的请求。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。