HTTP Başlıkları (Headers) Nedir?

Yayın tarihi:

13 dk okuma

Acar Diveroli
Yazar: Acar Diveroli
Çapraz uçan izometrik REQUEST ve RESPONSE kâğıt çiftlerinde Host, User-Agent, Content-Type satırları; bir REQUEST mavi

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:

  1. Tarayıcınız sunucuya bağlanır. https:// ile başlayan adreslerde önce şifrelemeyi kurar.
  2. İstek satırını ve istek başlıklarını gönderir: GET /, ardından Host, User-Agent, Accept, Accept-Language ve o site için kayıtlı çerezler.
  3. Boş bir satır başlıkları bitirir. Bir form ya da API çağrısı bunun ardından bir gövde ekler.
  4. Sunucu başlıkları okur: Host siteyi, Accept-Language dili, Cookie oturum açmış kullanıcıyı belirler.
  5. Durum satırı ve yanıt başlıklarıyla cevap verir: 200 OK ve Content-Type gibi; ardından boş satır ve gövde gelir.
  6. 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:

text
> 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ıkSunucuya ne söyler?Örnek değer
HostHangi siteyi istediğiniziexample.com
User-AgentTarayıcıyı ya da uygulamayı ve sürümünücurl/8.22.0
AcceptKullanabildiğiniz dosya türlerinitext/html
Accept-LanguageTercih ettiğiniz dilleritr-TR,tr;q=0.9
CookieBu site için kayıtlı çerezleritheme=dark
AuthorizationSite ya da API için giriş bilgisiniBearer <token>
RefererGeldiğ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ıkTarayıcıya ne söyler?Örnek değer
Content-TypeGövdedeki dosyanın türünüapplication/json
Cache-ControlÖnbellekte tutulup tutulmayacağını, ne kadar süreylemax-age=3600
Set-CookieSaklanacak bir çerezitheme=dark; Secure
LocationGidilecek sonraki adresi/login
Retry-AfterNe kadar bekleneceğini120
Strict-Transport-SecurityBundan 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:

  1. 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.
  2. Ağ sekmesine tıklayın. Geliştirici Araçları yalnız açıkken kayıt tutar, bu yüzden sayfayı yenileyin.
  3. Ad sütununda ilk satıra, yani sayfanın kendisine tıklayın.
  4. 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.
  5. 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.

cmd
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.com istek 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.com isteğ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-age saniye boyunca yalnız HTTPS ile açtırır. Tarayıcılar düz HTTP üzerinden gelen bu başlığı yok sayar. includeSubDomains yö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:pass gibi 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ği 407 Proxy Authentication Required yanı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-For ve standart karşılığı Forwarded, istemcinin asıl IP adresini taşır. Forwarded baş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:

text
> 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-Language başlığını okur.
  • Oturum açma: Cookie başlığı oturumunuzu her istekte taşır.
  • API'ler: Authorization içinde bir token, gövde için Content-Type: application/json.
  • Önbellek: Cache-Control ve Age, 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 gelen content-type baş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-For baş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 includeSubDomains ile 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örmekGeliştirici Araçları > Ağ > Başlıklar
Bir sitenin yanıtını hızlıca kontrol etmekcurl -I
Bir yönlendirmenin nereye gittiğini bulmakYanıttaki Location
Sayfanın neden başka dilde açıldığını anlamakİstekteki Accept-Language
Kendi sitenizi sağlamlaştırmakHSTS, CSP, nosniff, Referrer-Policy
Bir proxy'ye giriş yapmakUygulamanı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.

ChatGPT'ye sorClaude'a sor