ERR_HTTP2_PROTOCOL_ERROR Hatası: Nedir ve Nasıl Çözülür?

Advertisement
ERR_HTTP2_PROTOCOL_ERROR Nedir?
ERR_HTTP2_PROTOCOL_ERROR, tarayıcının protokol kurallarını çiğneyen bir HTTP/2 yanıtı aldığını gösteren bir Chrome ve Edge hatasıdır. Chromium içinde bu, -337 numaralı ağ hatasıdır: "there is an HTTP/2 protocol error" (bir HTTP/2 protokol hatası var). 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. … adresindeki web sayfası geçici olarak kapalı olabilir veya kalıcı olarak yeni bir web adresine taşınmış olabilir." Altında da ERR_HTTP2_PROTOCOL_ERROR yazar.
HTTP/2, artık çoğu HTTPS sitenin kullandığı daha hızlı HTTP sürümüdür. HTTP/1.1'den daha katıdır: yanıtlar ikili çerçevelere bölünür, başlıklar kesin kurallara uyar ve bir yanıtın bildirilen boyutu gerçekte gelenle eşleşmelidir. Chrome bu kuralları çiğneyen bir yanıt gördüğünde (örneğin akışın ortasında duran ya da yasak bir başlık içeren bir yanıt) yanıtın tamamını bozuk sayar ve atar.
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: sunucu 200 ile yanıt vermiş, ancak yanıt gövdesi hiçbir zaman eksiksiz ulaşmamıştır.
HTTP/2 Neleri Bozuk Yanıt Sayar
HTTP/2 standardı (RFC 9113), bir yanıtı bozuk hale getiren hataları listeler; tamamlanmadan önce sıfırlanan bir akış da başarısız olur. Gerçek hayattaki hataların çoğunun arkasında şu sorunlar vardır:
| 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; örneğin uzunluk ayarlandıktan sonra çıktının sıkıştırılması |
| Yanıt düzgün şekilde sona ermelidir | Sunucunun, proxy'nin veya uygulamanın göndermeyi yarıda kesmesi |
| Bağlantıya özgü başlıklar olmamalıdır | Bir HTTP/2 yanıtında Connection, Keep-Alive, Proxy-Connection, Transfer-Encoding veya Upgrade gönderilmesi |
| 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 |
Advertisement
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: akışın ortasında kesilen yanıtlar (disk alanı biten veya geçici dosyalarını yazamayan bir proxy, akış sırasında çöken bir uygulama, bir zaman aşımı), 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 yanıtları yeniden yazan antivirüs veya güvenlik duvarı yazılımları, istekleri ya da yanıtları değiştiren tarayıcı uzantıları, sayfanın önbellekte bozulmuş bir kopyası 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.
Advertisement
Çözüm 2: O Sitenin Önbelleğini ve Çerezlerini Temizleyin
Önbellekte bozulmuş bir kopya ya da şişmiş bir çerez, tek bir sitede hatayı tekrar tekrar tetikleyebilir. Yalnızca o sitenin verilerini temizleyin: adres çubuğunun solundaki simgeye tıklayın → Çerezler ve site verileri (veya Site ayarları) → verileri silin, ardından sayfayı yenileyin. Daha kapsamlı bir temizlik için Ctrl + Shift + Delete tuşlarına basın ve son birkaç günün Önbelleğe alınan resimler ve dosyalar verilerini 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 Chrome'un bozuk saydığı yanıtları iletebilir. Yalnızca HTTPS tarama özelliğini kapatın (genellikle HTTPS taraması, Web Kalkanı, SSL/TLS protokol filtreleme veya Şifreli bağlantıları tara gibi adlar taşır) 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.
Advertisement
Çö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 açın. Her yerde başarısız oluyorsa site bozuktur ve yalnızca sahibi düzeltebilir. Yalnızca Chrome veya Edge başarısız oluyorsa sorun yine genellikle sitededir, çünkü bozuk HTTP/2'yi en katı şekilde Chrome reddeder; yine de Çözüm 2 ve 3'ü tekrarlamaya değer.
Çözüm 5: Sayfayı HTTP/2 Olmadan Test Edin
Chrome, HTTP/2 kapalı olarak başlatılabilir; bu da sorunun HTTP/2 olup olmadığını kesin olarak gösterir. Önce tüm Chrome pencerelerini kapatın, ardından tarayıcıyı bir terminalden başlatın:
# Windows (Komut İstemi)
"C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-http2
# macOS (Terminal)
open -a "Google Chrome" --args --disable-http2Sayfa bu pencerede yükleniyorsa sitenin HTTP/2 yanıtları bozuktur ve sahibinin bunları düzeltmesi gerekir. Ardından Chrome'u kapatıp normal şekilde yeniden açın. Bu bayrak yalnızca o tek açılış için geçerlidir.
Advertisement
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: çıktının sonuna bakın
curl -sv --http2 https://example.com/broken-page -o /dev/null
# Bozuk bir akış şuna benzer bir satırla biter:
# HTTP/2 stream 1 was not closed cleanly: PROTOCOL_ERROR (err 1)
# (curl 8.19+: HTTP/2 stream 1 reset by server (error 0x1 PROTOCOL_ERROR))
# Karşılaştırma için aynı URL, HTTP/1.1 üzerinden
curl -sv --http1.1 https://example.com/broken-page -o /dev/nullHTTP/1.1 çalışıyor ve HTTP/2 başarısız oluyorsa hatayı doğrulamışsınız demektir. İkisi arasındaki yanıt başlıklarını karşılaştırın ve akış kopmadan önce kaç bayt geldiğini not edin. HTTP Başlık Kontrolü aracı da sitenizin gönderdiği 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 erken duran 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 yanıt erken biter ve tarayıcı bir protokol hatası bildirir. Kontrol edin:
df -h # herhangi bir disk dolu mu?
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 geçici dizinleri; sahibi nginx kullanıcısı olmalıUygulamanı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.
Bağlantıya özgü başlıklar: yanıtlarda
Connection,Keep-Alive,Transfer-EncodingveyaUpgradeayarlayan kodu kaldırın. HTTP/2 bunları yasaklar; nginx çoğunu sizin yerinize ayıklasa da bazı uygulama sunucuları ve proxy'ler bunu yapmaz.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 çeker ve durum kodunu ve tüm yanıt başlıklarını listeler; böylece yasak veya bozuk başlıkları kolayca fark edersiniz.
Dene HTTP Başlık KontrolüAdvertisement
Sıkça Sorulan Sorular
Chrome'un protokol kurallarını çiğneyen bir HTTP/2 yanıtı aldığı (örneğin erken biten, yanlış boyut bildiren veya yasak başlıklar içeren bir yanıt) ve bu yüzden yanıtı attığı anlamına gelir. Chromium'da -337 numaralı ağ hatasıdır.