ฉันกำลังทำงานกับเว็บไซต์ซึ่งก่อให้เกิดnet::ERR_HTTP2_PROTOCOL_ERROR 200
ข้อผิดพลาดใน Google Chrome ฉันไม่แน่ใจว่าสิ่งใดที่สามารถกระตุ้นข้อผิดพลาดนี้ได้ฉันเพิ่งสังเกตว่ามันจะโผล่ออกมาเฉพาะเมื่อเข้าถึงเว็บไซต์ใน HTTPS ฉันไม่แน่ใจ 100% ว่าเกี่ยวข้องกัน แต่ดูเหมือนว่าจะป้องกันไม่ให้มีการเรียกใช้ JavaScript อย่างถูกต้อง
ตัวอย่างเช่นสถานการณ์ต่อไปนี้เกิดขึ้น:
ฉันกำลังเข้าถึงเว็บไซต์ใน HTTPS
ฟีด Twitter ของฉันรวม อยู่ในhttps://publish.twitter.comไม่ได้โหลดเลย
ฉันสามารถสังเกตเห็นในคอนโซล ERR_HTTP2_PROTOCOL_ERROR
หากฉันลบรหัสเพื่อโหลดฟีด Twitter ข้อผิดพลาดจะยังคงอยู่
ถ้าฉันเข้าถึงเว็บไซต์ใน HTTP ฟีด Twitter จะปรากฏขึ้นและข้อผิดพลาดจะหายไป
Google Chrome เป็นเว็บเบราว์เซอร์เดียวที่ก่อให้เกิดข้อผิดพลาด: ทำงานได้ดีบน Edge และ Firefox (NB: ฉันลองกับ Safari และฉันมีเหมือนกันkcferrordomaincfnetwork 303
ข้อผิดพลาดที่ )
ฉันสงสัยว่าอาจเกี่ยวข้องกับส่วนหัวที่ส่งคืนโดยเซิร์ฟเวอร์เนื่องจากมีการกล่าวถึงข้อผิดพลาด '200' หรือไม่และหน้า 404/500 ไม่ได้กระตุ้นอะไรเลย
สิ่งที่เป็นข้อผิดพลาดที่ไม่ได้บันทึกไว้เลย การค้นหาของ Google ให้ผลลัพธ์ที่น้อยมาก ยิ่งกว่านั้นฉันสังเกตเห็นว่ามันปรากฏใน Google Chrome รุ่นล่าสุด ข้อผิดพลาดจะไม่ปรากฏบน v.64.X แต่เกิดขึ้นใน v.75 + (ไม่ว่าจะใช้ระบบปฏิบัติการใดฉันกำลังใช้ Mac tho อยู่)
เบาะแสที่จุดนี้ในการตรวจสอบใด ๆ ที่จะได้รับการชื่นชมอย่างดีใจ!
ขอบคุณล่วงหน้า.
อุโมงค์
แก้ไข 1:อาจเกี่ยวข้องกับเว็บไซต์ OK บน Firefox แต่ไม่ใช่ใน Safari (kCFErrorDomainCFNetwork ข้อผิดพลาด 303) ทั้ง Chrome (สุทธิ :: ERR_SPDY_PROTOCOL_ERROR)
แก้ไข 2:ข้อค้นพบจากการสืบสวนเพิ่มเติมมีดังนี้:
- ข้อผิดพลาดจะไม่ปรากฏในหน้าเดียวกันถ้าเซิร์ฟเวอร์ส่งคืน 404 แทนที่จะเป็น 2XX
- ข้อผิดพลาดจะไม่ปรากฏในท้องถิ่นด้วยใบรับรอง HTTPS
- ข้อผิดพลาดปรากฏขึ้นบนเซิร์ฟเวอร์ที่แตกต่างกัน (ทั้งสองเป็น OVH) ซึ่งใช้ใบรับรองที่แตกต่างกัน
- ข้อผิดพลาดปรากฏไม่ว่าจะใช้ PHP เวอร์ชันใดจาก 5.6 ถึง 7.3 (เฟรมเวิร์กที่ใช้: Cakephp 2.10)
แก้ไข 3:ตามที่ร้องขอด้านล่างเป็นส่วนหัวที่ส่งคืนสำหรับแหล่งทรัพยากรที่ล้มเหลวซึ่งเป็นหน้าเว็บทั้งหมด แม้ว่าข้อผิดพลาดจะเกิดขึ้นในแต่ละหน้ามีส่วนหัว HTTP 200 หน้าเหล่านั้นมักจะโหลดบนเบราว์เซอร์ของลูกค้า แต่บางครั้งองค์ประกอบขาดหายไป (ในตัวอย่างของฉันฟีด Twitter ภายนอก) เนื้อหาอื่น ๆ ทั้งหมดในแท็บเครือข่ายมีผลตอบแทนที่ประสบความสำเร็จยกเว้นเอกสารทั้งหมดเอง
ส่วนหัวของ Google Chrome (มีข้อผิดพลาด):
ส่วนหัวของ Firefox (ไม่มีข้อผิดพลาด):
curl --head --http2
คำขอในคอนโซลกลับประสบความสำเร็จต่อไปนี้:
HTTP/2 200
date: Fri, 04 Oct 2019 08:04:51 GMT
content-type: text/html; charset=UTF-8
content-length: 127089
set-cookie: SERVERID31396=2341116; path=/; max-age=900
server: Apache
x-powered-by: PHP/7.2
set-cookie: xxxxx=0919c5563fc87d601ab99e2f85d4217d; expires=Fri, 04-Oct-2019 12:04:51 GMT; Max-Age=14400; path=/; secure; HttpOnly
vary: Accept-Encoding
แก้ไข 4: การพยายามเจาะลึกลงไปกับ chrome: // net-export / และhttps://netlog-viewer.appspot.comเครื่องมือบอกให้ฉันทราบว่าคำขอจบลงด้วย RST_STREAM:
t=123354 [st=5170] HTTP2_SESSION_RECV_RST_STREAM
--> error_code = "2 (INTERNAL_ERROR)"
--> stream_id = 1
สำหรับสิ่งที่ฉันอ่านในโพสต์อื่นนี้ " ใน HTTP / 2 ถ้าลูกค้าต้องการยกเลิกคำขอก็จะส่ง RST_STREAM เมื่อเซิร์ฟเวอร์ได้รับ RST_STREAM มันจะหยุดส่งเฟรมข้อมูลไปยังลูกค้าดังนั้นการหยุดการตอบสนอง (หรือดาวน์โหลด) การเชื่อมต่อยังคงสามารถใช้งานได้สำหรับคำขออื่น ๆ และคำขอ / การตอบกลับที่เกิดขึ้นพร้อมกันกับคำขอที่ถูกยกเลิกอาจดำเนินการต่อไปได้ [... ] เป็นไปได้ว่าเมื่อถึงเวลาที่ RST_STREAM เดินทางจาก ไคลเอนต์ไปยังเซิร์ฟเวอร์เนื้อหาทั้งหมดของการร้องขออยู่ในระหว่างการขนส่งและจะมาถึงลูกค้าซึ่งจะละทิ้งมันอย่างไรก็ตามสำหรับเนื้อหาการตอบสนองขนาดใหญ่การส่ง RST_STREAM อาจมีโอกาสที่ดีที่จะมาถึงเซิร์ฟเวอร์ก่อนที่จะทั้งหมด เนื้อหาการตอบสนองถูกส่งและดังนั้นจะประหยัดแบนด์วิดท์ "
พฤติกรรมที่อธิบายนั้นเหมือนกับที่ฉันสังเกตได้ แต่นั่นหมายความว่าเบราว์เซอร์เป็นผู้ร้ายและจากนั้นฉันจะไม่เข้าใจว่าทำไมมันจึงเกิดขึ้นในสองหน้าเหมือนกันโดยที่หนึ่งมี 200 ส่วนหัวและอีก 404 (เหมือนกันถ้าฉันปิดการใช้งาน JS)