Bir internet mağazasına giriyorsunuz: site Türkçe karşınıza çıkıyor, oturumunuz açık kalıyor ve sayfa önbellekten hızla yükleniyor. Bunların hiçbirine sayfanın kendisi karar vermedi. Sayfanın ilk satırı gelmeden önce tarayıcınız ile sunucu, isteği kimin yaptığını, neyi kabul ettiğini ve karşılığında ne geleceğini anlatan bir düzine kısa satırı birbirine gönderir. Bu satırlar HTTP başlıklarıdır (HTTP headers).
Bu yazıda curl ile kaydettiğimiz gerçek bir isteği ve yanıtı, en sık karşılaşacağınız başlıkları, başlık adlarının büyük/küçük harfe duyarlı olup olmadığını ve başlıkları Chrome'da ya da curl ile nasıl okuyacağınızı anlatıyoruz. Yazının sonunda site sahipleri için güvenlik başlıklarını, bir proxy'nin eklediği ya da okuduğu başlıkları ve sık sorulan altı soruyu bulacaksınız.
HTTP başlıkları nedir?
HTTP başlıkları, bir isteğin ya da yanıtın başında, içeriğin kendisinden önce gönderilen ve her biri bir ad taşıyan ek bilgilerdir. HTTP'yi tanımlayan standart RFC 9110, içerikten önce gelen bu alanlara "header fields", kısaca "headers" (başlıklar) der. Her biri bir ad, iki nokta üst üste ve bir değerden oluşan tek bir satırdır: Accept-Language: tr-TR gibi.
Her HTTP mesajı aynı biçimdedir: bir ilk satır, başlıklar, bir boş satır ve varsa gövde. İstekte ilk satır yöntemi ve yolu (GET /), yanıtta durum kodunu (200 OK) verir. Gövde sayfanın, resmin ya da verinin kendisidir; başlıklar onu ve iletişimin iki tarafını anlatır.
İstek başlıkları tarayıcınızdan ya da uygulamanızdan sunucuya gider, yanıt başlıkları geri gelir. MDN'in İngilizce HTTP başlıkları başvuru sayfası, bütün standart başlıkları gruplara ayırarak listeler. X- ile başlayan adlar, standartta yer almayan ve geliştiricilerin kendi eklediği uzantılardır; 2012'de bu adlandırma alışkanlığından vazgeçilmesi önerildi, ama bu tür adların birçoğu hâlâ kullanılıyor.
Bir istekte ve yanıtta başlıklar nasıl işler?
Bir sayfanın yüklenmesi bir istek ve bir yanıttan oluşur; ikisinin de kendi başlıkları vardır:
- Tarayıcınız sunucuya bağlanır.
https://ile başlayan adreslerde önce şifrelemeyi kurar. - İstek satırını ve istek başlıklarını gönderir:
GET /, ardındanHost,User-Agent,Accept,Accept-Languageve o site için kayıtlı çerezler. - Boş bir satır başlıkları bitirir. Bir form ya da API çağrısı bunun ardından bir gövde ekler.
- Sunucu başlıkları okur:
Hostsiteyi,Accept-Languagedili,Cookieoturum açmış kullanıcıyı belirler. - Durum satırı ve yanıt başlıklarıyla cevap verir:
200 OKveContent-Typegibi; ardından boş satır ve gövde gelir. - Tarayıcı bunlara göre davranır: sayfayı gösterir, çerezleri saklar, bir kopyayı önbelleğe alır ya da yönlendirmeyi izler.
Gerçek bir HTTP isteği ve yanıtı neye benzer?
Aşağıda curl -v ile example.com'a gönderdiğimiz bir istek ve gelen yanıt var. curl, web adreslerindeki içeriği komut satırından indiren bir araçtır; Windows 10 ve 11'de, macOS'ta ve çoğu Linux sisteminde hazır gelir. -v (verbose, ayrıntılı) seçeneği iki tarafı da yazdırır. Komutu 15 Kasım 2026'da Windows 11'de çalıştırdık ve çıktıda yalnız başlıkları bıraktık:
> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/8.22.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sun, 15 Nov 2026 15:40:29 GMT
< Content-Type: text/html; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Server: cloudflare
< last-modified: Thu, 12 Nov 2026 21:56:22 GMT
< allow: GET, HEAD
< Accept-Ranges: bytes
< Age: 6679
< cf-cache-status: HIT
< alt-svc: h3=":443"; ma=86400> ile başlayan satırlar curl'ün gönderdikleri, < ile başlayanlar sunucunun yanıtıdır; tek başına duran >, istek başlıklarını bitiren boş satırdır. curl üç istek başlığı gönderir, bir tarayıcı ise ondan fazla.
Content-Type: text/html; charset=utf-8: gövde, UTF-8 metin olarak yazılmış bir web sayfasıdır.Age: 6679: sitenin önündeki içerik dağıtım ağı (CDN) bu kopyayı 6.679 saniyedir, yani yaklaşık 1 saat 51 dakikadır tutuyor.cf-cache-status: HIT: standart bir başlık değil; o ağın, kopyanın kendi önbelleğinden geldiğini bildiren notu.alt-svc: h3=":443": site 443 numaralı portta HTTP/3'ü de destekliyor.
Content-Type ile last-modified satırlarına dikkat edin: aynı yanıtta adlar iki farklı biçimde yazılmış.
HTTP başlıkları büyük/küçük harfe duyarlı mı?
Hayır, başlık adları büyük/küçük harfe duyarlı değildir: Content-Type, content-type ve CONTENT-TYPE aynı başlıktır. RFC 9110 bunu tek cümleyle söyler: "Field names are case-insensitive." Aynı sayfayı düz http:// üzerinden istediğimizde sunucu Last-Modified ve Allow adlarını bu kez büyük harfle başlattı.
Değerlerde kural her başlığa göre değişir. text/html ile TEXT/HTML aynı dosya türünü anlatır, ama bir çerez değeri ya da giriş token'ı sunucunun gönderdiği hâliyle, harfi harfine geri gitmelidir.
Protokolün yeni sürümleri olan HTTP/2 ve HTTP/3, adların küçük harfle yazılmasını zorunlu kılar; Chrome Geliştirici Araçları'nın content-type göstermesinin sebebi budur. Testimizde Chromium example.com'u HTTP/3 ile açtı ve isteğini :method, :path, :scheme ve :authority satırlarıyla başlattı. Bu sözde başlıklar (pseudo-header), HTTP/1.1'de ilk satırda ve Host başlığında giden bilgiyi taşır.
Kendi kodunuzda başlık adlarını büyük/küçük harf ayrımı yapmadan karşılaştırın. JavaScript'in Headers nesnesi ve Python'un requests kütüphanesi bunu zaten yapar; düz bir sözlük (dictionary) yapmaz.
En yaygın istek başlıkları hangileri?
İstek başlıkları isteği kimin yaptığını ve neyi kabul ettiğini anlatır:
| Başlık | Sunucuya ne söyler? | Örnek değer |
|---|---|---|
| Host | Hangi siteyi istediğinizi | example.com |
| User-Agent | Tarayıcıyı ya da uygulamayı ve sürümünü | curl/8.22.0 |
| Accept | Kullanabildiğiniz dosya türlerini | text/html |
| Accept-Language | Tercih ettiğiniz dilleri | tr-TR,tr;q=0.9 |
| Cookie | Bu site için kayıtlı çerezleri | theme=dark |
| Authorization | Site ya da API için giriş bilgisini | Bearer <token> |
| Referer | Geldiğiniz sayfayı | https://example.com/ |
Host, tek bir sunucunun ve tek bir IP adresinin birçok siteyi taşımasını sağlar: sunucu bu başlıktaki adı okur ve doğru siteyi seçer. Accept-Language sayesinde site, siz bir dil seçmeden önce hangi dilde açılacağına karar verir. q sayıları 0 ile 1 arasındaki ağırlıklardır: tr-TR,tr;q=0.9 önce Türkiye Türkçesi, sonra herhangi bir Türkçe demektir.
Cookie, sitenin daha önce Set-Cookie ile sakladığı küçük değerleri, örneğin oturum kimliğini geri taşır. Çerezin nasıl kaydedilip geri gönderildiğini adım adım Çerez (Cookie) Nedir, Ne İşe Yarar? yazısında anlattık.
Authorization, sitenin kendisi için kimlik bilgisi taşır ve çoğu zaman bir 401 Unauthorized yanıtından sonra gelir; standart, proxy'nin bu başlığı değiştirmesini yasaklar. Standartta da yanlış yazılan Referer, sizi buraya getiren bağlantının bulunduğu sayfayı bildirir; başka bir siteye giden bağlantıda tarayıcılar varsayılan olarak yalnız kaynağı (origin), yani https://example.com/ gibi site adresini gönderir. Chrome kendi başlıklarını da ekler; tarayıcı markalarını ve sürümlerini kısa bir liste hâlinde veren sec-ch-ua bunlardan biridir.
En yaygın yanıt başlıkları hangileri?
Yanıt başlıkları tarayıcıya neyin geldiğini ve onunla ne yapacağını söyler:
| Başlık | Tarayıcıya ne söyler? | Örnek değer |
|---|---|---|
| Content-Type | Gövdedeki dosyanın türünü | application/json |
| Cache-Control | Önbellekte tutulup tutulmayacağını, ne kadar süreyle | max-age=3600 |
| Set-Cookie | Saklanacak bir çerezi | theme=dark; Secure |
| Location | Gidilecek sonraki adresi | /login |
| Retry-After | Ne kadar bekleneceğini | 120 |
| Strict-Transport-Security | Bundan sonra yalnız HTTPS kullanılmasını | max-age=31536000 |
Content-Type, tarayıcının gövdeyle ne yapacağını belirler: text/html sayfa olarak gösterilir, image/png resim olarak açılır, application/json bir betiğe verilir. Bir sayfanın bazen ham kod olarak görünmesinin sebebi yanlış bir değerdir. Content-Disposition: attachment ise tarayıcıdan dosyayı göstermek yerine indirmesini ister.
Cache-Control önbellek kurallarını belirler: max-age=3600 kopyanın bir saat boyunca yeniden kullanılmasına izin verir, no-store kopya tutulmasını yasaklar. Set-Cookie tek yanıtta birçok kez, her çerez için bir satır olarak gelebilir. Location yönlendirmelerle (3xx kodları) gelir ve yeni adresi verir.
Retry-After, 503 Service Unavailable ve 429 Too Many Requests yanıtlarıyla gelir ve ne kadar beklenmesi gerektiğini saniye ya da tarih olarak söyler. Retry-After: 120 iki dakika demektir; kurallara uyan bir istemci o kadar bekler.
HTTP başlıkları Chrome'da nasıl görülür?
Chrome her isteğin bütün başlıklarını Geliştirici Araçları'nda (DevTools), Ağ panelinde gösterir. Türkçe arayüzdeki adlarla adımlar şöyle:
- Sayfayı açın ve F12 tuşuna ya da Windows'ta Ctrl + Shift + I tuşlarına basın (Mac'te Cmd + Option + I). Sayfaya sağ tıklayıp İncele'yi seçmek de aynı işi görür.
- Ağ sekmesine tıklayın. Geliştirici Araçları yalnız açıkken kayıt tutar, bu yüzden sayfayı yenileyin.
- Ad sütununda ilk satıra, yani sayfanın kendisine tıklayın.
- Başlıklar sekmesini açın. Genel bölümü adresi, yöntemi ve durum kodunu gösterir; altında Yanıt başlıkları ve Türkçe arayüzde bu adla geçen İstek üst bilgileri bölümleri gelir.
- Satırları geldikleri hâliyle ve sırasıyla görmek için bir bölümün yanındaki İşlenmemiş kutusunu işaretleyin.
"Hazır başlıklar gösteriliyor. Bütün başlıkları görmek için önbelleği devre dışı bırakın." uyarısını görürseniz dosya büyük olasılıkla tarayıcının önbelleğinden gelmiştir; panelin üstündeki Önbelleği devre dışı bırak kutusunu işaretleyip sayfayı yenileyin. Chrome'un Ağ paneli başvuru belgesi, bir başlığı istek listesinde sütun olarak göstermek gibi diğer seçenekleri anlatır.
Bir isteği tarayıcının dışında tekrarlamak için üzerine sağ tıklayın ve Windows'ta Kopyala > cURL (cmd) olarak kopyala'yı, Mac'te cURL olarak kopyala'yı seçin. Kopyalanan komut çerezlerinizi ve varsa giriş başlığınızı içerir; onu hiçbir zaman herkese açık bir foruma ya da sohbete yapıştırmayın.
HTTP başlıkları curl ile nasıl görülür?
curl başlıkları komut satırından gösterir; kendi sitenizi hızlıca kontrol etmek için kullanışlıdır. Komutları Komut İstemi'nde çalıştırın; Windows PowerShell'de ise curl yerine curl.exe yazın, çünkü orada curl başka bir komutun takma adıdır.
curl -I https://example.com-I, HEAD isteğiyle yalnız yanıt başlıklarını ister; bizim denememizde yukarıdakiyle aynı yanıt başlıkları çıktı. İki seçenek daha:
curl -v https://example.comistek başlıklarını, yanıt başlıklarını ve bağlantı ayrıntılarını gösterir.curl -I -H "Accept-Language: de" https://example.comisteğe kendi seçtiğiniz bir başlığı ekler; örneğin sitenizin Almanca bir tarayıcıya nasıl cevap verdiğini denemek için.
Windows ile gelen curl HTTP/1.1 kullanır (ayrıntılı çıktısında ALPN: curl offers http/1.1 yazar); bu yüzden adları sunucu nasıl yazdıysa öyle görürsünüz. HTTP/2 desteğiyle derlenmiş bir curl ise HTTP/2 destekleyen sitelerde adları küçük harfle yazdırır.
Bir site hangi güvenlik başlıklarını göndermeli?
Güvenlik başlıkları, tarayıcının siteniz için ek korumaları açmasını sağlayan yanıt başlıklarıdır. Bunları web sunucusunda, içerik dağıtım ağında ya da uygulamanın kendisinde ayarlarsınız:
- Strict-Transport-Security (HSTS): siteyi
max-agesaniye boyunca yalnız HTTPS ile açtırır. Tarayıcılar düz HTTP üzerinden gelen bu başlığı yok sayar.includeSubDomainsyönergesini ancak bütün alt alan adlarınız HTTPS ile çalışıyorsa ekleyin. - Content-Security-Policy (CSP): sayfanın betikleri, stilleri ve resimleri nereden yükleyebileceğini listeler; böylece sayfaya dışarıdan sokulmuş bir betiğin yapabileceklerini sınırlar.
- X-Content-Type-Options: nosniff: tarayıcı dosya türünü tahmin etmez,
Content-Type'a güvenir. - X-Frame-Options ya da CSP'deki
frame-ancestors: başka sitelerin sayfanızı bir çerçeve içinde gösterip gösteremeyeceğini belirler. Ziyaretçiyi görünmeyen bir sayfaya tıklatma hilesi olan clickjacking'e karşı korur. - Referrer-Policy: ziyaretçi sitenizden ayrılırken sayfa adresinizin ne kadarının
Referer'a yazılacağını belirler.
Sitenizi curl -I ile ya da Geliştirici Araçları'ndaki Yanıt başlıkları bölümünden kontrol edin. Oturum çerezlerinde Set-Cookie içindeki Secure, HttpOnly ve SameSite işaretleri de en az bunlar kadar önemlidir.
Proxy hangi başlıkları ekler ya da okur?
Proxy'nin kendine ait birkaç başlığı vardır: bazılarını sizden okur, bazılarını isteğinizi iletmeden önce ekleyebilir.
Proxy-Authorization,user:passgibi proxy giriş bilgilerinizi proxy'ye taşır; proxy bu başlığı kendisi kullanır, siteye iletmez.Proxy-Authenticate, giriş bilgisi eksik ya da yanlış olduğunda proxy'nin gönderdiği407 Proxy Authentication Requiredyanıtıyla gelir.Via, mesajın bir aracıdan geçtiğini kaydeder; HTTP standardı proxy'nin bu başlığı eklemesi gerektiğini söyler.X-Forwarded-Forve standart karşılığıForwarded, istemcinin asıl IP adresini taşır.Forwardedbaşlığını tanımlayan RFC 7239, anonimlik sağlamak amacıyla çalışan bir proxy'nin bu başlığı kullanmayacağını söyler.
Proxy'leri şeffaf, anonim ve elite diye ayıran şey, Via ya da X-Forwarded-For ekleyip eklemedikleridir. Şeffaf, Anonim ve Elite Proxy Farkları Nedir? yazısı aynı isteğin üç seviyede hedefe nasıl ulaştığını gösteriyor.
HTTPS'te bunların çoğu ortadan kalkar. https:// ile başlayan bir adres için uygulamanız proxy'den CONNECT isteğiyle bir tünel açmasını ister; proxy bundan sonra şifreli baytları okumadan iletir. curl'ü kendi bilgisayarımızdaki küçük bir test proxy'si üzerinden, örnek giriş bilgisi user:pass ile çalıştırdık:
> CONNECT example.com:443 HTTP/1.1
> Host: example.com:443
> Proxy-Authorization: Basic dXNlcjpwYXNz
> User-Agent: curl/8.22.0
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 Connection established
<
> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/8.22.0
> Accept: */*Proxy'nin günlüğüne yalnız ilk blok kaydedildi. GET isteği ve başlıkları şifreli tünelin içinden geçti; proxy onları ne okuyabildi ne de onlara satır ekleyebildi. dXNlcjpwYXNz ise yalnızca user:pass'in Base64 ile kodlanmış hâlidir: bu bir kodlamadır, şifreleme değildir.
Bir HTTPS Proxy trafiğinizi böyle taşır: Proxynet'in ağ geçidi tüneli şifresini çözmeden aktarır, bu yüzden bizim verdiğimiz bir sertifikayı yüklemeniz gerekmez. Proxy, sitenin gördüğü IP adresini değiştirir; bu, kendi başlıklarınızı yeniden yazmak için bir sebep değildir. User-Agent, Referer ya da X-Forwarded-For başlıklarını başka bir tarayıcı ya da başka bir ziyaretçi gibi görünmek için değiştirmeyin; çalıştırdığınız betikler, aracınızın adını taşıyan dürüst bir User-Agent göndermelidir.
HTTP başlıklarıyla nerede karşılaşırsınız?
- Dil sürümleri: site, size ilk göstereceği sayfayı seçmek için
Accept-Languagebaşlığını okur. - Oturum açma:
Cookiebaşlığı oturumunuzu her istekte taşır. - API'ler:
Authorizationiçinde bir token, gövde içinContent-Type: application/json. - Önbellek:
Cache-ControlveAge, saklanan kopyanın hâlâ taze olup olmadığına karar verir. - İndirmeler:
Content-Disposition, dosyanın tarayıcıda açılacağını ya da diske kaydedileceğini belirler.
Sık yapılan hatalar
- Kodda başlık adlarını büyük/küçük harfe duyarlı okumak. Düz bir sözlükte
headers["Content-Type"], HTTP/2 sunucusundan gelencontent-typebaşlığını bulamaz. - "cURL olarak kopyala" komutunu paylaşmak. Komut çerezlerinizi taşır; onu eline geçiren herkes sizin adınıza işlem yapabilir.
- İnternetten gelen
X-Forwarded-Forbaşlığına güvenmek. İstemci istediği değeri gönderebilir; yalnız kendi proxy'nizin ya da trafiği sunucularınıza dağıtan yük dengeleyicinizin eklediği kayıtlar güvenilirdir. - HSTS'yi
includeSubDomainsile erken açmak. HTTPS'i olmayan bir alt alan adı, başlığı görmüş ziyaretçiler için açılmaz hâle gelir. - Çerezlerin birikmesine izin vermek. Büyük çerezler isteği sunucunun başlık sınırının üstüne çıkarır ve site 400 ya da 431 döner.
Karar rehberi
| Ne istiyorsunuz? | Nereye bakmalı, ne kullanmalı? |
|---|---|
| Tarayıcınızın ne gönderdiğini görmek | Geliştirici Araçları > Ağ > Başlıklar |
| Bir sitenin yanıtını hızlıca kontrol etmek | curl -I |
| Bir yönlendirmenin nereye gittiğini bulmak | Yanıttaki Location |
| Sayfanın neden başka dilde açıldığını anlamak | İstekteki Accept-Language |
| Kendi sitenizi sağlamlaştırmak | HSTS, CSP, nosniff, Referrer-Policy |
| Bir proxy'ye giriş yapmak | Uygulamanızın gönderdiği Proxy-Authorization |
Sıkça sorulan sorular
User-Agent başlığı nedir?
İsteği yapan tarayıcının ya da programın adını, sürümünü ve genellikle işletim sistemini bildiren istek başlığıdır; curl curl/8.22.0 gönderir. Siteler onu istatistik tutmak ve sayfayı tarayıcıların kendine özgü sorunlarına göre uyarlamak için kullanır. Kendi User-Agent'ınızı nasıl okuyacağınızı User-Agent Nedir, Nasıl Öğrenilir ve Değiştirilir? yazısında anlattık.
X-Forwarded-For ne demek?
Bir proxy'nin ya da yük dengeleyicinin, isteği kendisine gönderen istemcinin IP adresini yazdığı başlıktır; böylece arkadaki sunucu ziyaretçinin adresini görür. Hiçbir zaman resmî bir standart olmadı; standart karşılığı Forwarded (RFC 7239) başlığıdır. Herkes bu başlığı gönderebildiği için sunucu yalnız kendi proxy'sinin eklediği kayıtlara güvenmelidir.
HTTPS'te HTTP başlıkları şifrelenir mi?
Evet. HTTPS'te başlıklar da gövdeyle birlikte şifreli olarak gider; yoldaki ağlar ve proxy'ler onları okuyamaz. Sunucunun IP adresi görünür kalır; alan adı da çoğu durumda görünür, çünkü şifreli bağlantı kurulurken gönderilir.
API'de HTTP başlıkları nedir?
Aynı başlıklardır, yalnızca daha bilinçli kullanılır. Bir API çağrısı genellikle Authorization içinde bir anahtar ya da token gönderir (bazı API'ler X-API-Key gibi kendi başlıklarını kullanır), gövdeyi Content-Type: application/json ile tanımlar ve Accept ile JSON ister. Çok fazla istek gönderildiğinde cevap çoğu zaman Retry-After taşıyan bir 429 olur.
"HTTP header is larger than 8192 bytes" ne demek?
Bir isteğin ya da yanıtın, onu işleyen yazılımın kabul ettiğinden fazla başlık verisi taşıdığı anlamına gelir. Bu ifade Java ağ kütüphanesi Netty'nin mesajıdır ve Netty'nin varsayılan sınırı 8.192 bayttır; mesajda görülebilen 10.240 gibi başka sayılar, ayarlarla değiştirilmiş sınırlardır. HTTP'nin kendisi bir üst sınır koymaz. Ziyaretçiyseniz o sitenin çerezlerini silin; geliştiriciyseniz çerezleri ya da token'ları küçültün veya sınırı yükseltin.
Referer başlığı neden yanlış yazılmış?
Çünkü yanlış yazılmış ad 1996 tarihli HTTP/1.0 belirtiminde zaten yer alıyordu ve yazılımlar her yerde başlığı bu adla okuyor. Bugünkü standart Referer adını bir "[sic]" notuyla korur; daha yeni olan Referrer-Policy başlığı ise doğru yazılmıştır.
Özet
HTTP başlıkları, her isteğin ve yanıtın başındaki Ad: değer satırlarıdır. İstek başlıkları siteyi, tarayıcıyı, dilleri, çerezleri ve kimlik bilgilerini bildirir; yanıt başlıkları gövdenin ne olduğunu, ne kadar süre önbellekte tutulacağını, hangi çerezlerin saklanacağını ve sıradaki adresi söyler. Adlar büyük/küçük harfe duyarlı değildir; HTTP/2 ve HTTP/3 onları küçük harfle yazar. Başlıkları Geliştirici Araçları'nda ya da curl ile okuyun, kendi sitenizden de güvenlik başlıkları gönderin. HTTPS'te proxy yalnız site adını ve proxy giriş bilgilerinizi taşıyan kısa CONNECT isteğini görür; kendi trafiğinizi bir proxy üzerinden yönlendirmek isterseniz proxy hizmetlerimizden başlayabilirsiniz.




