ERR_HTTP2_PROTOCOL_ERROR: Anlamı ve Çözümü (Chrome, Edge)
Önemli bilgi
ERR_HTTP2_PROTOCOL_ERROR (Chromium hata kodu -337), sayfayı taşıyan HTTP/2 akışının başarısız olduğu anlamına gelir. Ya sunucu, proxy veya CDN akışı yarıda sıfırlamıştır (Chrome bu tür her sıfırlamayı -337 olarak bildirir) ya da Chrome HTTP/2 kurallarını çiğneyen başlıkları reddetmiştir. Ziyaretçiler için sayfayı yenilemek, Gizli pencere açmak, sitenin çerezlerini temizlemek veya antivirüsün HTTPS taramasını duraklatmak bazen işe yarar, ancak çoğu zaman yalnızca site düzeltebilir. Site sahipleri için olağan nedenler sunucunun ya da proxy'nin tamamlayamadığı bir yanıt (dolu disk, yazılamayan geçici klasör, çöken uygulama), gövdeyle eşleşmeyen bir Content-Length ya da Transfer-Encoding gibi yasak bir başlıktır. Hatayı curl --http2 -v ile yeniden üretin.
Şimdi kontrol edin

Okumaya başlayın
- ERR_
HTTP2_ PROTOCOL_ ERROR Nedir? - HTTP/2 Neleri Bozuk Yanıt Sayar
- ERR_
HTTP2_ PROTOCOL_ ERROR Hatasına Ne Neden Olur? - Çözüm 1: Sert Yenileme Yapın ve Gizli Pencereyi Deneyin
- Çözüm 2: O Sitenin Çerezlerini ve Önbelleğe Alınan Dosyalarını Temizleyin
- Çözüm 3: Antivirüsün HTTPS Taramasını ve Uzantıları Duraklatın
- Çözüm 4: Chrome'u Güncelleyin ve Diğer Tarayıcıları Kontrol Edin
- Çözüm 5: Sayfayı HTTP/2 Olmadan Test Edin
- Web Sitesi Sahipleri İçin: HTTP/2 Protokol Hatalarını Düzeltme
- 1. Hatayı curl ile Yeniden Üretin
- 2. Akışın Ortasında Kesilen Yanıtları Kontrol Edin
- 3. Content-Length'i ve Yasak Başlıkları Düzeltin
- ERR_
HTTP2_ PROTOCOL_ ERROR ve Benzer Hatalar - Sıkça Sorulan Sorular
ERR_HTTP2_PROTOCOL_ERROR Nedir?
ERR_HTTP2_PROTOCOL_ERROR, sayfayı taşıyan HTTP/2 akışının başarısız olduğunu gösteren bir Chrome ve Edge hatasıdır: sunucu akışı bitmeden sıfırlamış ya da tarayıcının reddettiği başlıklar göndermiştir. Chromium içinde bu, -337 numaralı ağ hatasıdır: "There is an HTTP/2 protocol error" (net_error_list.h). Chrome'un bu hata için özel bir sayfası yoktur; bu yüzden genel hata sayfasını görürsünüz: "Bu siteye ulaşılamıyor" başlığı ve "… adresindeki web sayfası, geçici olarak kullanılamıyor veya kalıcı olarak yeni bir web adresine taşınmış olabilir." açıklaması; altında da ERR_HTTP2_PROTOCOL_ERROR yazar. Edge aynı kodu kendi "Hmm… can't reach this page" ekranında gösterir.
HTTP/2, artık çoğu HTTPS sitenin kullandığı daha hızlı HTTP sürümüdür. Her istek, tek bir bağlantı içinde ayrı bir akış olarak ilerler ve iki taraf da bir akışı sıfırlayarak iptal edebilir. Chrome, sunucudan gelen her sıfırlamayı sunucunun gerekçesi ne olursa olsun protokol hatası olarak bildirir; başlıklar HTTP/2 kurallarını çiğnediğinde de akışı kendisi iptal eder (Transfer-Encoding başlığı, başlık adında büyük harf, eksik durum kodu).
Geliştiriciler bu hatayı DevTools konsolunda çoğu zaman net::ERR_HTTP2_PROTOCOL_ERROR 200 (OK) olarak görür. Bu kombinasyon güçlü bir ipucudur: başlıklar geçerliydi ve sunucu 200 ile yanıt verdi, ancak gövde gelirken akış koptu.
Bir sayfanın gerçekte gönderdiği başlıkları görün
HTTP/2 Neleri Bozuk Yanıt Sayar
HTTP/2 standardı (RFC 9113), bir yanıtı bozuk hale getiren hataları listeler. Gerçek hayattaki hataların çoğunun arkasında bu sorunlar vardır; her birinin tarayıcıya nasıl ulaştığı aşağıda:
| Kural | Kuralı ne bozar |
|---|---|
| Content-Length gövde boyutuna eşit olmalıdır | Bir sunucunun veya eklentinin bir boyut bildirip başka bir boyut göndermesi; öndeki proxy, CDN veya sunucu bunun üzerine akışı sıfırlar |
| Yanıt düzgün şekilde sona ermelidir | Sunucunun, proxy'nin veya uygulamanın yanıtı tamamlayamaması (dolu disk, çökme, zaman aşımı) ve akışı sıfırlaması; nginx, başlattığı bir yanıtı tamamlayamadığında bunu yapar |
| Bağlantıya özgü başlıklar olmamalıdır | Bir HTTP/2 yanıtında Transfer-Encoding (Chrome reddeder); Connection, Keep-Alive, Proxy-Connection ve Upgrade de yasaktır ve curl gibi katı istemciler bunları reddeder |
| Başlık adları küçük harfle yazılmalıdır | Büyük harf içeren başlık adlarının olduğu gibi HTTP/2'ye aktarılması |
| Geçerli başlık değerleri | Bir başlık değerinin içinde satır sonu veya başka yasak karakterler bulunması |
| Geçerli bir :status satırı | Eksik veya okunamayan bir durum kodu |
ERR_HTTP2_PROTOCOL_ERROR Hatasına Ne Neden Olur?
Vakaların çoğu sunucu tarafından kaynaklanır, ancak kendi bilgisayarınızdaki birkaç şey de bir yanıtı size ulaşırken bozabilir:
- Sunucuda: sunucunun veya proxy'nin tamamlayamadığı bir yanıt (disk alanı biten veya geçici dosyalarını yazamayan bir proxy, akış sırasında çöken bir uygulama, bir zaman aşımı), öndeki proxy'nin pes etmesine yol açan yanlış Content-Length değerleri, yasak veya geçersiz başlıklar ve eski bir sunucu ya da CDN yapılandırmasındaki hatalı HTTP/2 desteği.
- Sizin tarafınızda: HTTPS'i inceleyip trafiği yeniden yazan antivirüs veya güvenlik duvarı yazılımları, istekleri ya da yanıtları değiştiren tarayıcı uzantıları, sunucunun yanlış işlediği bir istek (örneğin aşırı büyük çerezler) ve ara sıra eski bir Chrome sürümü.
Çözüm 1: Sert Yenileme Yapın ve Gizli Pencereyi Deneyin
Sayfayı önbelleği kullanmadan yenilemek için Ctrl + Shift + R (Mac: Cmd + Shift + R) tuşlarına basın. Bir kez yarıda kesilen bir yanıt, sonraki denemede sorunsuz gelebilir.
Ardından sayfayı bir Gizli pencerede açın (Ctrl + Shift + N, Mac'te Cmd + Shift + N). Gizli pencerede çerez ve normal profilinizden gelen önbellek yoktur, uzantılar da varsayılan olarak kapalıdır. Sayfa orada yükleniyorsa Çözüm 2 veya Çözüm 3 normal pencerenizdeki sorunu giderir.
Çözüm 2: O Sitenin Çerezlerini ve Önbelleğe Alınan Dosyalarını Temizleyin
Sitenin çerezlerini ve önbelleğe alınan dosyalarını temizlemek, Chrome'un gönderdiği isteği değiştirir (daha az çerez, yeniden doğrulanacak önbellek kopyası yok) ve bir sunucu hatasını atlatabilir. Adres çubuğunun solundaki Site bilgilerini görüntüle simgesine tıklayın → Çerezler ve site verileri → Cihaz üzerindeki site verilerini yönetin → verileri silin, ardından sayfayı yenileyin. Daha kapsamlı bir temizlik için Ctrl + Shift + Delete tuşlarına basın ve Son 7 gün için Önbelleğe alınan resimler ve dosyalar öğesini temizleyin.
Çözüm 3: Antivirüsün HTTPS Taramasını ve Uzantıları Duraklatın
HTTPS'in şifresini çözüp inceleyen güvenlik yazılımları her HTTP/2 bağlantısının ortasında durur. HTTP/2 desteği hatalı veya güncel değilse akışları bozabilir ya da Chrome'un reddettiği başlıkları iletebilir. Yalnızca HTTPS tarama özelliğini kapatın (Avast/AVG: Web Shield → "Enable HTTPS scanning"; ESET: "SSL/TLS protocol filtering"; Kaspersky: "Scan encrypted connections") ve sayfayı yenileyin. Bu sorunu çözerse antivirüsü güncelleyin ve site için bir istisna ekleyin.
Ardından chrome://extensions adresinden tüm uzantıları devre dışı bırakın, sayfayı yenileyin, sonra uzantıları teker teker yeniden açın. Reklam engelleyiciler, gizlilik araçları ve başlıkları düzenleyen her şey olağan şüphelilerdir.
Çözüm 4: Chrome'u Güncelleyin ve Diğer Tarayıcıları Kontrol Edin
Bekleyen güncellemeleri yüklemek için chrome://settings/help adresini açın, ardından tarayıcıyı yeniden başlatın. Sonra aynı sayfayı Firefox'ta veya Safari'de, ayrıca başka bir cihazda ya da ağda açın. Her yerde başarısız oluyorsa site bozuktur ve yalnızca sahibi düzeltebilir (antivirüsün HTTPS taraması bir bilgisayardaki tüm tarayıcıları etkiler; bu yüzden asıl test ikinci bir cihazdır). Yalnızca Chrome veya Edge başarısız oluyorsa site büyük olasılıkla Chrome'un reddettiği bir başlık gönderiyordur; yine de Çözüm 2 ve 3'ü tekrarlamaya değer.
Çözüm 5: Sayfayı HTTP/2 Olmadan Test Edin
Chrome, HTTP/2 (ve HTTP/3) kapalı olarak başlatılabilir; bu, HTTP/2'nin işin içinde olup olmadığını gösterir. Bir terminalden ikinci, ayrı bir Chrome başlatın; ek profil klasörü, normal Chrome'unuz açıkken bile onu yeni bir örnek yapar:
# Windows (Command Prompt)
"C:\Program Files\Google\Chrome\Application\chrome.exe" --user-data-dir="%TEMP%\h2test" --disable-http2 --disable-quic
# macOS (Terminal)
open -na "Google Chrome" --args --user-data-dir=/tmp/h2test --disable-http2 --disable-quicSayfa o pencerede yükleniyorsa sitenin HTTP/2 yanıtları sorunludur ve sahibinin bunları düzeltmesi gerekir. Sayfa şimdi ERR_CONTENT_LENGTH_MISMATCH veya ERR_INCOMPLETE_CHUNKED_ENCODING ile başarısız oluyorsa sunucu, protokol ne olursa olsun yanıtı yarıda kesiyordur. İşiniz bitince o pencereyi kapatın; normal Chrome'unuz etkilenmez.
Web Sitesi Sahipleri İçin: HTTP/2 Protokol Hatalarını Düzeltme
Farklı ağlardaki ve tarayıcılardaki ziyaretçiler hatayı bildiriyorsa sorun sizin altyapınızdadır. Aşağıdaki üç kontrol, bu hataların neredeyse tamamını bulur.
1. Hatayı curl ile Yeniden Üretin
# HTTP/2: watch the end of the output
curl -sv --http2 https://example.com/broken-page -o /dev/null
# A stream the server gave up on ends with something like:
# HTTP/2 stream 1 was not closed cleanly: INTERNAL_ERROR (err 2)
# (curl 8.19+: HTTP/2 stream 1 reset by server (error 0x2 INTERNAL_ERROR);
# "reset by curl" means curl rejected the response itself)
# Same URL over HTTP/1.1 for comparison
curl -sv --http1.1 https://example.com/broken-page -o /dev/nullHTTP/1.1 çalışıyor ve HTTP/2 başarısız oluyorsa HTTP/2 işin içindedir. "Reset by server", sunucunun ya da bir proxy'nin yanıtın ortasında pes ettiğini gösterir. curl tam olarak Chrome'un kontrol ettiklerini kontrol etmez (Chrome'un kabul ettiği Content-Length uyuşmazlıklarını ve bağlantı başlıklarını reddeder); bu yüzden bunu kanıt değil, güçlü bir ipucu olarak değerlendirin. HTTP Başlık Kontrolü aracı, uygulamanızın ayarladığı başlıkları ağınızın dışından gösterir.
2. Akışın Ortasında Kesilen Yanıtları Kontrol Edin
Sunucu tarafındaki en yaygın neden, başlayan (durum 200, başlıklar gönderilmiş) ama sonra tamamlanamayan bir yanıttır. nginx, uygulamanızdan gelen büyük yanıtları geçici dosyalara arabelleğe alır; disk doluysa veya nginx geçici klasörüne yazamıyorsa akışı sıfırlar ve tarayıcı bir protokol hatası bildirir. Kontrol edin:
df -h # is any disk full?
sudo grep -E "No space left|Permission denied" /var/log/nginx/error.log | tail
ls -ld /var/lib/nginx/proxy /var/lib/nginx/fastcgi # Debian/Ubuntu packages
ls -ld /var/cache/nginx/proxy_temp /var/cache/nginx/fastcgi_temp # nginx.org packages
# the temp folders must be writable by the nginx worker userUygulamanın kendisini de kontrol edin: büyük bir sayfayı veya indirmeyi akış halinde gönderirken çöken, zaman aşımına uğrayan ya da bellek limitine takılan bir PHP veya Node işlemi aynı sonucu doğurur. Hatanın gerçekleştiği zamana ait uygulama günlükleri bunu genellikle gösterir.
3. Content-Length'i ve Yasak Başlıkları Düzeltin
- Content-Length: bırakın sunucu hesaplasın. Bir eklenti, ara katman yazılımı (middleware) veya web sunucusu da çıktıyı sıkıştırıyor ya da değiştiriyorsa bu değeri uygulama kodunda elle ayarlamayın; aksi halde bildirilen uzunluk gönderilen baytlarla artık eşleşmez. WordPress sitelerinde bu, PHP kodunda bir uzunluk ayarlanırken bir eklentinin veya PHP ayarının çıktıyı ayrıca sıkıştırmasıyla ortaya çıkabilir.
- Transfer-Encoding: bir HTTP/2 yanıtında asla göndermeyin; Chrome böyle bir başlık görünce akışı sıfırlar. RFC 9113 ayrıca
Connection,Keep-Alive,Proxy-ConnectionveUpgradebaşlıklarını da yasaklar. Chrome bunları yok sayar, ancak curl ve diğer katı istemciler reddeder; nginx ise proxy'lenen yanıtlardan çoğunu sizin yerinize ayıklar. - Başlık değerleri: hiçbir başlığın satır sonu veya kontrol karakteri içermediğinden emin olun. Bu genellikle bir başlığa yerleştirilen kullanıcı girdisinden kaynaklanır; örneğin
Content-Dispositioniçindeki bir dosya adı. - Öndeki CDN: Cloudflare veya başka bir CDN kullanıyorsanız hatanın kaynak sunucudan mı yoksa CDN'den mi geldiğini anlamak için kaynak sunucuyu doğrudan test edin (curl
--resolveveya bir hosts kaydıyla).
ERR_HTTP2_PROTOCOL_ERROR ve Benzer Hatalar
| Hata | Kod | Ne oldu |
|---|---|---|
| ERR_HTTP2_PROTOCOL_ERROR | -337 | Bir HTTP/2 yanıtı protokol kurallarını çiğnedi |
| ERR_QUIC_PROTOCOL_ERROR | -356 | Aynı türde bir hata, HTTP/3 (QUIC) üzerinde |
| ERR_SSL_PROTOCOL_ERROR | -107 | HTTPS (TLS) el sıkışması HTTP/2 başlamadan önce başarısız oldu |
| ERR_CONNECTION_CLOSED | -100 | Bağlantı, sayfa gelmeden önce kapatıldı |
| ERR_EMPTY_RESPONSE | -324 | Sunucu hiçbir şey göndermedi |
Ayrıntılı rehberler: ERR_QUIC_PROTOCOL_ERROR, ERR_SSL_PROTOCOL_ERROR, ERR_CONNECTION_CLOSED ve ERR_EMPTY_RESPONSE. Bir sitenin sertifikasını ve HTTPS kurulumunu dışarıdan kontrol etmek için SSL Sertifika Kontrolü aracını kullanın.
Sitenizin gerçekte gönderdiği başlıkları görün
DNS Robot'un HTTP Başlık Kontrolü aracı, herhangi bir URL'yi bizim sunucularımızdan HTTP/1.1 ile çeker; durum kodunu ve uygulamanızın ayarladığı her yanıt başlığını (Content-Length, Content-Encoding, Content-Disposition) listeler. Böylece bunları curl --http2 çıktısıyla karşılaştırabilirsiniz.
Kaynaklar
- net_error_list.h (HTTP2_PROTOCOL_ERROR -337), Chromium
- RFC 9113: HTTP/2, malformed messages, IETF
- HTTP/2: ERR_HTTP2_PROTOCOL_ERROR, Cloudflare


