Tôi hiện đang làm việc trên một trang web, điều này gây ra net::ERR_HTTP2_PROTOCOL_ERROR 200
lỗi trên Google Chrome. Tôi không chắc chắn chính xác những gì có thể gây ra lỗi này, tôi chỉ nhận thấy nó chỉ bật ra khi truy cập trang web trong HTTPS. Tôi không thể chắc chắn 100% nó có liên quan, nhưng có vẻ như nó ngăn chặn javascript được thực thi đúng cách.
Chẳng hạn, kịch bản sau đây xảy ra:
Tôi đang truy cập trang web trong HTTPS
Nguồn cấp dữ liệu Twitter của tôi được tích hợp qua https://publish.twitter.com hoàn toàn không được tải
Tôi có thể nhận thấy trong bảng điều khiển ERR_HTTP2_PROTOCOL_ERROR
Nếu tôi xóa mã để tải nguồn cấp dữ liệu Twitter, lỗi vẫn còn
Nếu tôi truy cập trang web bằng HTTP, nguồn cấp dữ liệu Twitter sẽ xuất hiện và lỗi sẽ biến mất
Google Chrome là trình duyệt web duy nhất gây ra lỗi: nó hoạt động tốt trên cả Edge và Firefox. (NB: Tôi đã thử với Safari và tôi gặp kcferrordomaincfnetwork 303
lỗi tương tự )
Tôi đã tự hỏi liệu nó có thể liên quan đến tiêu đề được máy chủ trả về hay không vì có lỗi '200' này và một trang 404/500 không kích hoạt bất cứ điều gì.
Điều đó là lỗi không được ghi nhận ở tất cả. Tìm kiếm Google cho tôi rất ít kết quả. Hơn nữa, tôi nhận thấy nó xuất hiện trên các bản phát hành Google Chrome gần đây; lỗi không xuất hiện trên v.64.X, nhưng nó xảy ra trên v.75 + (bất kể hệ điều hành; tôi đang làm việc trên Mac tho).
Bất kỳ manh mối tại thời điểm này để điều tra sẽ được vui mừng đánh giá cao!
Cảm ơn trước.
Tristan
Chỉnh sửa 1: Có thể liên quan đến Trang web OK trên Firefox nhưng không phải trên Safari (kCFErrorDomainCFNetwork lỗi 303) cũng không phải Chrome (net :: ERRinksDY_PROTOCOL_ERROR)
Chỉnh sửa 2: Kết quả từ các cuộc điều tra tiếp theo như sau:
- lỗi không xuất hiện trên cùng một trang nếu máy chủ trả về 404 thay vì 2XX
- lỗi không bật trên cục bộ với chứng chỉ HTTPS
- lỗi xuất hiện trên một máy chủ khác (cả hai đều là OVH), sử dụng chứng chỉ khác
- lỗi xuất hiện bất kể phiên bản PHP nào được sử dụng, từ 5.6 đến 7.3 (khung được sử dụng: Cakephp 2.10)
Chỉnh sửa 3: Theo yêu cầu, bên dưới là tiêu đề được trả về cho ressource không thành công, đó là toàn bộ trang web. Ngay cả khi lỗi đang kích hoạt trên mỗi trang có tiêu đề HTTP 200, các trang đó luôn tải trên trình duyệt của khách hàng, nhưng đôi khi thiếu một yếu tố (trong ví dụ của tôi, nguồn cấp dữ liệu Twitter bên ngoài). Mọi tài sản khác trên tab Mạng đều có lợi nhuận thành công, ngoại trừ toàn bộ tài liệu.
Tiêu đề Google Chrome (có lỗi):
Tiêu đề Firefox (không có lỗi):
Một curl --head --http2
yêu cầu trong bảng điều khiển trả về thành công sau:
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
Chỉnh sửa 4: Cố gắng đi sâu hơn với chrome: // net-export / và https://netlog-viewer.appspot.com công cụ đang cho tôi biết yêu cầu kết thúc bằng RST_STREAM:
t=123354 [st=5170] HTTP2_SESSION_RECV_RST_STREAM
--> error_code = "2 (INTERNAL_ERROR)"
--> stream_id = 1
Đối với những gì tôi đã đọc trong bài đăng khác này , " Trong HTTP / 2, nếu khách hàng muốn hủy bỏ yêu cầu, nó sẽ gửi RST_STREAM. Khi máy chủ nhận được RST_STREAM, nó sẽ ngừng gửi các khung DATA cho khách hàng, do đó dừng phản hồi (hoặc tải xuống). Kết nối vẫn có thể sử dụng được cho các yêu cầu khác và các yêu cầu / phản hồi đồng thời với yêu cầu đã bị hủy có thể tiếp tục tiến triển. [...] Có thể đến thời điểm RST_STREAM đi từ máy khách đến máy chủ, toàn bộ nội dung của yêu cầu đang được chuyển và sẽ đến máy khách, nó sẽ loại bỏ nó. Tuy nhiên, đối với nội dung phản hồi lớn, việc gửi RST_STREAM có thể có cơ hội đến máy chủ trước toàn bộ nội dung phản hồi được gửi và do đó sẽ tiết kiệm băng thông. "
Hành vi được mô tả giống như hành vi tôi có thể quan sát. Nhưng điều đó có nghĩa là trình duyệt là thủ phạm, và sau đó tôi sẽ không hiểu tại sao nó lại xảy ra trên hai trang giống hệt nhau với một trang có tiêu đề 200 và trang kia là 404 (tương tự nếu tôi tắt JS).