İçeriğe geç
KubeAtlas
HTTP API SRE Networking

HTTP Status Kodları: Eksiksiz Referans Rehberi

Onur Ömer Tunç 7 dk okuma

1xx — Bilgilendirici (Informational)

KodİsimNe anlama gelir
100ContinueSunucu istek header'larını aldı, client body'yi gönderebilir. Büyük dosya upload'larında Expect: 100-continue ile kullanılır.
101Switching ProtocolsProtokol geçişi onaylandı. HTTP → WebSocket yükseltmesinde (Upgrade: websocket) bu kod döner.
102ProcessingWebDAV: sunucu isteği işliyor, henüz yanıt yok. Uzun süren operasyonlarda timeout'u önler.
103Early HintsYanıt gelmeden önce Link header'ları gönderilir. CDN ve edge ortamlarında kritik kaynakları önceden yükletir.
SRE notu: 101'i WebSocket bağlantılarında Kubernetes ingress konfigürasyonunda görmek normaldir. Nginx ingress için nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" ve proxy-send-timeout: "3600" annotation'larını unutmayın — aksi halde ingress bağlantıyı keser.

2xx — Başarılı (Successful)

KodİsimNe anlama gelir
200OKStandart başarı yanıtı. Body içeriği metoda göre değişir: GET → kaynak, POST → işlem sonucu, PUT → güncellenmiş kaynak.
201CreatedKaynak oluşturuldu. Location header'ı yeni kaynağın URI'ını içermeli. POST ve PUT ile kullanılır.
202Acceptedİstek alındı, işlem asenkron devam ediyor. Hemen sonuç dönemeyecek job/queue işlemlerinde kullanılır.
203Non-Authoritative InformationYanıt bir proxy veya cache tarafından değiştirildi. Origin'den farklı metadata dönüyor olabilir.
204No ContentBaşarılı ama body yok. DELETE ve bazı PUT işlemlerinde standarttır.
205Reset ContentClient, formu veya görünümü sıfırlasın. Browser form reset'lerinde kullanılır.
206Partial ContentRange header'ı ile kısmi içerik döndürüldü. Büyük dosya indirme, video streaming ve resume-able download'larda kullanılır.
207Multi-StatusWebDAV: tek istekte birden fazla kaynağın durumu XML body içinde döner.
208Already ReportedWebDAV: aynı bağlamaya önceki yanıtta zaten raporlandı.
226IM UsedHTTP delta encoding: sunucu bir veya daha fazla instance manipulation uyguladı.
SRE notu: 202'yi kullanan bir API'niz varsa mutlaka bir polling mekanizması veya webhook callback stratejisi tanımlayın. "İstek alındı" demek "tamamlandı" demek değil — bu ayrımı client'lara dokümante edin ve monitoring'de 202 → tamamlanma süresini ayrı bir metrik olarak takip edin.

3xx — Yönlendirme (Redirection)

KodİsimNe anlama gelir
300Multiple ChoicesBirden fazla seçenek mevcut; client seçmeli (örn. farklı dil veya format). Nadiren kullanılır.
301Moved PermanentlyKaynak kalıcı olarak taşındı. Tarayıcılar ve arama motorları Location header'ındaki yeni URL'yi cache'ler.
302FoundGeçici yönlendirme. POST sonrası tarayıcı genellikle GET ile yönlendirir (PRG pattern).
303See OtherPOST/PUT/DELETE sonrası her zaman GET ile yönlendir. Form işleme sonrası standart davranış.
304Not ModifiedCache geçerli, body gönderilmedi. If-None-Match / If-Modified-Since koşullu isteklerine yanıt. Bant genişliği tasarrufu için kritik.
307Temporary RedirectGeçici yönlendirme, yöntem değişmez (POST → POST). 302'dan farkı budur.
308Permanent RedirectKalıcı yönlendirme, yöntem değişmez. HTTPS migration'larında 301 yerine tercih edilir.
SRE notu: HTTP → HTTPS migration yaparken 301 değil 308 kullanın. 301 ile tarayıcı orijinal metodu cache'ler ve POST isteklerini GET'e dönüştürebilir. Kubernetes ingress'te ssl-redirect: "true" annotation'ı 308 döndürür — bu doğru davranış. Redirect chain'lerini kontrol edin: curl -L -v https://domain.com 2>&1 | grep -E "< HTTP|Location" — iki adımdan fazla redirect SEO için maliyetlidir.

4xx — İstemci Hataları (Client Errors)

KodİsimNe anlama gelir
400Bad RequestSunucu isteği anlayamadı. Bozuk syntax, geçersiz parametre veya eksik zorunlu field.
401UnauthorizedKimlik doğrulama gerekli veya başarısız. WWW-Authenticate header'ı hangi auth şemasının beklendiğini söyler.
402Payment RequiredÖdeme gerekli. Pek çok SaaS API'ı rate limit aşımında bunu kullanır.
403ForbiddenKimliğiniz doğrulandı ama bu kaynağa erişim izniniz yok.
404Not FoundKaynak bulunamadı. Var olmayan bir şeye erişildi veya kasıtlı gizlendi (güvenlik için 403 yerine).
405Method Not AllowedBu HTTP metodu bu endpoint için geçerli değil. Allow header'ı izin verilen metodları listeler.
406Not AcceptableSunucu, Accept header'ındaki formatta yanıt üretemez. Content negotiation başarısız.
407Proxy Auth Required401 gibi ama proxy authentication için.
408Request TimeoutClient belirlenen sürede isteği tamamlamadı. Sunucu bağlantıyı kapattı.
409Conflictİstek, kaynağın mevcut durumu ile çelişiyor. Aynı anda iki güncelleme, duplicate kayıt veya versiyon uyumsuzluğu.
410GoneKaynak kalıcı olarak silindi ve geri gelmeyecek. SEO için önemli — arama motorları URL'yi index'ten çıkarır.
411Length RequiredContent-Length header zorunlu ama gönderilmedi.
412Precondition FailedIf-Match / If-Unmodified-Since koşulu başarısız oldu. Optimistic locking için kullanılır.
413Content Too LargeRequest body sunucunun kabul ettiği limitin üzerinde. Dosya upload limitlerini aştınız.
414URI Too LongURL sunucunun işleyebileceğinden uzun. Genellikle çok uzun query string'ler.
415Unsupported Media TypeContent-Type sunucu tarafından desteklenmiyor. JSON API'a XML göndermek gibi.
416Range Not SatisfiableRange header'ı geçersiz veya kaynağın boyutunu aşıyor.
417Expectation FailedExpect header'ındaki koşul sunucu tarafından karşılanamaz.
418I'm a TeapotRFC 2324'ten gelen easter egg: bir çaydanlık kahve demleme isteğini reddediyor.
421Misdirected Requestİstek, yanıt veremeyecek bir sunucuya yönlendirildi. HTTP/2 multiplexing sorunlarında görülür.
422Unprocessable ContentSyntax geçerli ama semantik hatalar var. Form validasyon hatalarında standarttır.
423LockedWebDAV: kaynak kilitli.
424Failed DependencyWebDAV: başka bir işlemin başarısızlığından dolayı bu istek de başarısız.
425Too EarlyEarly data (0-RTT) ile gelen istek replay riski nedeniyle reddedildi. TLS 1.3 ile ilgili.
426Upgrade RequiredClient belirtilen protokole yükseltmeli. Upgrade header'ı hangi protokolün istendiğini söyler.
428Precondition RequiredKoşullu istek (If-Match) zorunlu — kaynak körce güncellenmemeli.
429Too Many RequestsRate limit aşıldı. Retry-After header'ı ne zaman tekrar deneneceğini söyler.
431Header Fields Too LargeHeader'lar çok büyük. Büyük cookie'ler veya çok sayıda custom header.
451Unavailable For Legal ReasonsYasal nedenlerle içerik engellendi. Ülke bazlı kısıtlamalar veya mahkeme kararları.
SRE notu: 429 için Retry-After header'ını mutlaka set edin ve exponential backoff uygulayan client'lar yazın. Rate limit olmayan API'lar, yük artışında cascade failure'a açıktır. Prometheus'ta http_requests_total{status="429"} metriğini alert'e bağlayın — aniden artan 429, ya bir attack ya da bir client'ın loop'a girdiğinin işaretidir.

5xx — Sunucu Hataları (Server Errors)

KodİsimNe anlama gelir
500Internal Server ErrorGenel sunucu hatası. Catch-all: beklenmeyen exception, null pointer, unhandled error.
501Not ImplementedSunucu bu HTTP metodunu desteklemiyor. Kısmi HTTP implementasyonlarında görülür.
502Bad GatewayProxy/gateway, upstream sunucudan geçersiz yanıt aldı. En sık görülen 5xx — pod hazır değil veya crash loop'ta.
503Service UnavailableSunucu geçici olarak hizmet dışı. Aşırı yük veya maintenance modunda.
504Gateway TimeoutProxy/gateway, upstream'den zamanında yanıt alamadı. Pod yanıt veriyor ama ingress timeout süresi aşıldı.
505HTTP Version Not SupportedSunucu, istekte kullanılan HTTP versiyonunu desteklemiyor.
506Variant Also NegotiatesContent negotiation döngüsel referansa yol açtı. Yanlış konfigürasyon.
507Insufficient StorageWebDAV: işlem tamamlamak için yeterli depolama alanı yok.
508Loop DetectedWebDAV: sonsuz döngü tespit edildi.
510Not Extendedİsteğin tamamlanması için ek uzantı gerekli.
511Network Auth RequiredAğ erişimi için kimlik doğrulama gerekli. Captive portal'larda (WiFi giriş sayfaları) görülür.
Kubernetes'te 502 ve 504 debug:

502 Bad Gateway → Pod hazır değil, crash loop'ta veya yanlış port'ta dinliyor
504 Gateway Timeout → Pod yanıt veriyor ama ingress timeout süresi aşıldı

502 debug adımları:

# Pod'ların Running ve Ready durumunu kontrol et
kubectl get pods -n <namespace> -o wide

# Endpoint'lerin kayıtlı olduğunu doğrula
kubectl get endpoints <service-name> -n <namespace>

# Pod loglarına bak
kubectl logs -n <namespace> <pod-name> --previous

# Service selector'ının pod label'larıyla eşleştiğini kontrol et
kubectl describe service <service-name> -n <namespace>

504 için ingress timeout’unu artırın:

nginx.ingress.kubernetes.io/proxy-connect-timeout: "60"
nginx.ingress.kubernetes.io/proxy-send-timeout: "120"
nginx.ingress.kubernetes.io/proxy-read-timeout: "120"

Prometheus ile HTTP Durum Kodu Monitoring

groups:
  - name: http_errors
    rules:
      - alert: HighErrorRate5xx
        expr: |
          sum(rate(http_requests_total{status=~"5.."}[5m])) by (service)
          /
          sum(rate(http_requests_total[5m])) by (service)
          > 0.01
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "{{ $labels.service }}: 5xx error rate > 1%"

      - alert: SuddenSpike4xx
        expr: |
          sum(rate(http_requests_total{status=~"4.."}[5m])) by (service)
          > 50
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "{{ $labels.service }}: 4xx spike detected"

Hangi Kod Ne Zaman Kullanılır — REST API Hızlı Referans

SenaryoDoğru Kod
GET isteği başarılı200 OK
POST ile kaynak oluşturuldu201 Created
DELETE başarılı, body yok204 No Content
Async iş kuyruğa alındı202 Accepted
Form validasyon hatası422 Unprocessable Content
Duplicate kayıt (email zaten var)409 Conflict
Token yok veya geçersiz401 Unauthorized
Token geçerli, yetki yok403 Forbidden
Kaynak bulunamadı404 Not Found
Rate limit aşıldı429 Too Many Requests
Sunucu beklenmeyen hatası500 Internal Server Error
Etiketler HTTP API SRE Networking