
Tarayıcıda CORS hatası çözümü: Access-Control-Allow-Origin başlığını görüntüleme rehberi.
Web dünyasında gezinirken veya bir web uygulamasını geliştirirken karşılaşılan en yaygın ve çoğu zaman kafa karıştırıcı hatalardan biri, hiç şüphesiz "Cross-Origin Resource Sharing" veya kısaca
CORS hatasıdır. Bu hata, genellikle bir web sayfasının, farklı bir kaynaktan (başka bir alan adı, protokol veya bağlantı noktası) kaynakları (veriler, betikler, stil dosyaları veya yazı tipleri gibi) güvenli bir şekilde istemeye çalıştığında ortaya çıkar. Tarayıcıların katı güvenlik politikaları nedeniyle bu türden çapraz kaynak istekleri varsayılan olarak engellenir. Ancak modern web uygulamaları genellikle farklı servislerden veri çektiği için bu kısıtlamayı aşmak bir zorunluluktur.
Bu rehberde, CORS hatasının ne olduğunu, neden ortaya çıktığını ve en önemlisi, bu hatanın anahtar çözümü olan `Access-Control-Allow-Origin` HTTP başlığını tarayıcınızda nasıl görüntüleyeceğinizi adım adım açıklayacağız. Bu bilgiyi edinmek, sorun giderme sürecinde size yol gösterecek ve uygulamanızın güvenli, sorunsuz bir şekilde çalışmasına yardımcı olacaktır.
CORS Hatası Nedir ve Neden Ortaya Çıkar?
CORS hatasını anlamak için öncelikle web güvenliğinin temel taşlarından biri olan "Aynı Kaynak Politikası"nı (Same-Origin Policy) kavramak önemlidir.
Same-Origin Policy (Aynı Kaynak Politikası) Nedir?
Aynı Kaynak Politikası, web tarayıcıları tarafından uygulanan kritik bir güvenlik mekanizmasıdır. Bu politika, bir web belgesinin veya betiğin, kendisinin geldiği kaynakla aynı olmayan başka bir kaynaktan kaynak yüklemesini veya bunlarla etkileşim kurmasını engeller. "Aynı kaynak" kavramı, üç temel bileşenin eşleşmesini gerektirir: protokol (HTTP/HTTPS), alan adı (example.com) ve bağlantı noktası (80/443). Bu üçünden herhangi biri farklıysa, kaynaklar "çapraz kaynak" olarak kabul edilir.
Bu güvenlik önlemi, kötü niyetli bir web sitesinin, kullanıcıların oturum açmış olduğu başka bir siteden gizlice veri çalmasını veya manipüle etmesini önlemek amacıyla tasarlanmıştır. Örneğin, zararlı bir web sitesi, sizin bankacılık sitenizde oturum açtığınızda arka planda bir AJAX isteği göndererek hesabınızdaki bilgileri çalmaya çalışamaz.
Cross-Origin Resource Sharing (CORS) Nedir?
Aynı Kaynak Politikası, güvenlik için hayati öneme sahip olsa da, modern web uygulamalarının dinamik doğası gereği bazen çok kısıtlayıcı olabilir. Single-page uygulamaları (SPA'lar), mobil uygulamalar ve API'ler genellikle birden fazla farklı alan adında barındırılan kaynaklara erişim gerektirir. İşte tam bu noktada
Cross-Origin Resource Sharing (CORS) devreye girer.
CORS, sunucuların, kendileriyle farklı bir kaynaktan gelen isteklerin onaylı olduğunu belirtmeleri için bir yol sağlayan bir mekanizmadır. Yani, Aynı Kaynak Politikası'nın katı kurallarına kontrollü istisnalar getirilmesine izin verir. Bir istemcinin (tarayıcının) başka bir kaynaktan bir kaynağa erişmesine izin vermek için, sunucunun yanıtında belirli HTTP başlıklarını göndermesi gerekir. Bu başlıklar, tarayıcıya söz konusu kaynağın belirli bir kaynaktan veya tüm kaynaklardan gelen isteklere yanıt vermeye yetkili olduğunu bildirir.
Tarayıcıda Görülen CORS Hataları
Bir CORS hatası meydana geldiğinde, tarayıcı genellikle konsolda bir hata mesajı görüntüler. Bu mesajlar genellikle şuna benzer:
* "Access to XMLHttpRequest at 'https://api.example.com/data' from origin 'https://www.mysite.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource."
* "The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed."
* "Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource."
Bu hata mesajları, genellikle sorunun kökenini işaret eder: sunucunun yanıtında beklenen `Access-Control-Allow-Origin` başlığının bulunmaması, yanlış yapılandırılması veya başka CORS ile ilgili bir başlığın eksik olması.
Access-Control-Allow-Origin Başlığı: Anahtar Bileşen
`Access-Control-Allow-Origin` başlığı, CORS mekanizmasının en temel ve en önemli parçasıdır. Bu başlık, sunucunun, kaynağı hangi originlerin (kaynakların) okuyabileceğini belirtmesine olanak tanır. Bir sunucu bu başlığı bir HTTP yanıtına dahil ettiğinde, tarayıcıya belirli bir kaynağın belirli bir web sitesinden veya tüm web sitelerinden gelen isteklere yanıt vermeye yetkili olduğunu bildirir.
Bu başlığın değeri genellikle iki ana formda olabilir:
1.
Belirli bir kaynak (origin): Örneğin, `Access-Control-Allow-Origin: https://www.example.com`. Bu, kaynağa yalnızca `https://www.example.com` adresinden gelen isteklerin erişebileceği anlamına gelir. Bu, güvenlik açısından en tercih edilen yöntemdir, çünkü erişimi yalnızca bilinen ve güvenilen kaynaklarla sınırlar.
2.
Joker karakter (wildcard): Örneğin, `Access-Control-Allow-Origin: *`. Bu, kaynağa herhangi bir kaynaktan gelen isteklerin erişebileceği anlamına gelir. Bu, daha az güvenli olmasına rağmen, herkese açık API'ler veya geliştirme ortamları için pratik bir çözüm olabilir. Ancak dikkatli kullanılmalıdır, zira her yerden erişime izin vermek güvenlik açıklarına yol açabilir.
Eğer tarayıcı, çapraz kaynak isteği gönderdiğinde sunucudan dönen yanıtta `Access-Control-Allow-Origin` başlığını bulamazsa veya bulunan değer istek yapan kaynağın adresiyle eşleşmezse, isteği engeller ve yukarıda bahsedilen CORS hatasını gösterir. Bu nedenle, bu başlığın doğru bir şekilde ayarlandığından emin olmak, CORS sorunlarını çözmenin ilk adımıdır.
Tarayıcıda Access-Control-Allow-Origin Başlığını Görüntüleme Rehberi
CORS hatasını teşhis etmenin en etkili yollarından biri, tarayıcınızın geliştirici araçlarını kullanarak ilgili HTTP isteklerinin ve yanıtlarının başlıklarını incelemektir. Bu, sunucudan dönen `Access-Control-Allow-Origin` başlığının var olup olmadığını ve değerinin ne olduğunu görmenizi sağlar.
Chrome Tarayıcısında Geliştirici Araçlarını Kullanma
Google Chrome, web geliştiricileri için güçlü bir dizi araca sahiptir.
1.
Geliştirici Araçlarını Açın: Problem yaşadığınız web sayfasını açın. Klavye kısayolu olarak `F12` tuşuna basabilir veya sağ tıklayıp "İncele" (Inspect) seçeneğini seçebilirsiniz.
2.
Ağ (Network) Sekmesine Geçin: Geliştirici araçları panelinde üstte bulunan sekmelerden "Network" (Ağ) sekmesini seçin.
3.
İstekleri Yeniden Yükleyin: Gerekirse, sayfayı yeniden yüklemek için tarayıcınızın yenile düğmesine tıklayın veya `Ctrl + R` (`Cmd + R` Mac'te) kullanın. Bu, ağ isteklerinin "Network" sekmesinde listelenmesini sağlar.
4.
İlgili İsteği Bulun: Sol taraftaki listede, CORS hatasına neden olduğunu düşündüğünüz isteği (genellikle API çağrısı, resim veya betik yüklemesi) bulun ve üzerine tıklayın.
5.
Başlıkları (Headers) İnceleyin: Sağ tarafta açılan panelde "Headers" (Başlıklar) sekmesini seçin. Burada "Response Headers" (Yanıt Başlıkları) bölümünü arayın. Bu bölümde, sunucudan dönen tüm HTTP başlıklarını göreceksiniz. `Access-Control-Allow-Origin` başlığını arayın.
* Eğer bu başlık listede yoksa, sunucu bu başlığı göndermiyor demektir.
* Eğer varsa, değerini (örneğin `*` veya `https://www.example.com`) kontrol edin ve bu değerin isteği yapan kaynağınızla uyumlu olup olmadığını inceleyin.
Firefox Tarayıcısında Geliştirici Araçlarını Kullanma
Mozilla Firefox da benzer işlevselliğe sahip geliştirici araçları sunar.
1.
Geliştirici Araçlarını Açın: `F12` tuşuna basın veya sağ tıklayıp "Öğeyi İncele" (Inspect Element) seçeneğini seçin.
2.
Ağ (Network) Sekmesine Geçin: Geliştirici araçları panelinde "Network" (Ağ) sekmesini seçin.
3.
İstekleri Yeniden Yükleyin: Sayfayı yenileyerek ağ isteklerinin listelenmesini sağlayın.
4.
İlgili İsteği Bulun: Soldaki listeden CORS hatasına neden olan isteği seçin.
5.
Başlıkları (Headers) İnceleyin: Sağ tarafta açılan panelde "Headers" (Başlıklar) sekmesini seçin. Burada "Response Headers" (Yanıt Başlıkları) bölümünde `Access-Control-Allow-Origin` başlığını arayın.
Safari Tarayıcısında Geliştirici Araçlarını Kullanma
Safari'de geliştirici araçlarını kullanabilmek için öncelikle tarayıcı tercihlerinden "Geliştirici" menüsünü etkinleştirmeniz gerekebilir (Safari > Tercihler > İleri Düzey > "Menü çubuğunda Geliştirici menüsünü göster" kutucuğunu işaretleyin).
1.
Geliştirici Araçlarını Açın: "Geliştirici" menüsünden "Web Denetçisini Göster" (Show Web Inspector) seçeneğini seçin veya `Option + Command + I` kısayolunu kullanın.
2.
Ağ (Network) Sekmesine Geçin: Web Denetçisi panelinde "Network" (Ağ) sekmesini seçin.
3.
İstekleri Yeniden Yükleyin: Sayfayı yeniden yükleyin.
4.
İlgili İsteği Bulun: Soldaki istek listesinden ilgili öğeyi seçin.
5.
Başlıkları (Headers) İnceleyin: Sağ tarafta açılan detay panelinde "Headers" (Başlıklar) sekmesini seçin ve "Response Headers" (Yanıt Başlıkları) altında `Access-Control-Allow-Origin` başlığını arayın.
Diğer Tarayıcılarda (Microsoft Edge, Opera)
Diğer modern tarayıcılar (Microsoft Edge, Opera gibi) da benzer geliştirici araçlarına sahiptir. Genellikle `F12` tuşuna basarak veya sağ tıklayıp "İncele" seçeneğini seçerek bu araçlara erişebilir, "Network" sekmesine giderek HTTP başlıklarını görüntüleyebilirsiniz. Temel adımlar ve prensipler tüm bu tarayıcılarda oldukça benzerdir, bu da
HTTP başlıkları görüntülemeyi evrensel bir sorun giderme becerisi haline getirir.
Yaygın CORS Hatası Senaryoları ve Çözüm Yaklaşımları
`Access-Control-Allow-Origin` başlığını görüntüleyerek sorunun kaynağını belirledikten sonra, çeşitli senaryolara göre çözüm yolları aramaya başlayabilirsiniz.
Eksik veya Yanlış Access-Control-Allow-Origin Başlığı
Bu, en yaygın CORS hatası nedenidir. Sunucu, ya `Access-Control-Allow-Origin` başlığını hiç göndermiyor ya da yanlış bir değerle gönderiyor (örneğin, isteği yapan kaynakla eşleşmeyen bir domain).
Çözüm: Sunucu tarafında yapılandırma yapmanız gerekir.
*
Node.js (Express.js):```javascript
app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "https://your-frontend-domain.com"); // Veya "*"
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
```
*
Apache: `.htaccess` dosyasına veya sunucu yapılandırmasına ekleyin:
```apache
Header set Access-Control-Allow-Origin "https://your-frontend-domain.com"
```
*
Nginx: Sunucu bloğunuza ekleyin:
```nginx
add_header Access-Control-Allow-Origin "https://your-frontend-domain.com";
```
*
PHP: Betiğinizin başında `header()` fonksiyonunu kullanın:
```php
header("Access-Control-Allow-Origin: https://your-frontend-domain.com");
```
`https://your-frontend-domain.com` yerine kendi ön yüz uygulamanızın alan adını yazmalısınız. Eğer birden fazla alan adı desteklemeniz gerekiyorsa, her isteğin `Origin` başlığını kontrol edip dinamik olarak `Access-Control-Allow-Origin` başlığını ayarlayabilirsiniz. Genel veya herkese açık API'ler için `*` kullanmak pratik olabilir ancak güvenlik açısından belirli kaynaklara izin vermek her zaman daha iyidir. Bu, uygulamanızın
web güvenliği açısından daha sağlam olmasını sağlar.
Kimlik Doğrulama (Credentials) ile İlgili Sorunlar
Eğer istemci tarafında kimlik bilgileriyle (çerezler, HTTP kimlik doğrulama başlıkları vb.) çapraz kaynak istekleri yapıyorsanız, sunucunun yanıtında `Access-Control-Allow-Credentials: true` başlığını göndermesi gerekir. Bu başlık gönderilmediyse veya `Access-Control-Allow-Origin` başlığı `*` olarak ayarlandıysa (ki bu durumda kimlik bilgileriyle istekler engellenir), CORS hatası alırsınız.
Çözüm: Sunucu tarafında `Access-Control-Allow-Credentials: true` başlığını ekleyin ve `Access-Control-Allow-Origin` başlığını belirli bir kaynakla sınırlayın, `*` kullanmaktan kaçının.
Preflight İstekleri (OPTIONS)
Bazı çapraz kaynak istekleri, "basit istekler" (simple requests) olarak kabul edilmez. Örneğin, `PUT`, `DELETE` gibi HTTP metotlarını kullanan veya `Content-Type: application/json` gibi özel başlıklar içeren istekler, gerçek isteği göndermeden önce bir "preflight" (ön kontrol) isteği yaparlar. Bu `OPTIONS` metoduyla yapılan bir istektir ve tarayıcı, sunucunun gerçek isteği kabul edip etmeyeceğini anlamak için bu isteği gönderir. Eğer sunucu `OPTIONS` isteğine uygun CORS başlıklarıyla (örneğin `Access-Control-Allow-Methods`, `Access-Control-Allow-Headers`) yanıt vermezse, tarayıcı asıl isteği engeller.
Çözüm: Sunucunuzun `OPTIONS` isteklerine yanıt verecek şekilde yapılandırıldığından emin olun. Bu yanıtta, izin verilen HTTP metotlarını (`Access-Control-Allow-Methods`) ve başlıkları (`Access-Control-Allow-Headers`) belirtmeniz gerekir. Ayrıca, `Access-Control-Max-Age` başlığı ile preflight yanıtının ne kadar süre önbelleğe alınacağını da belirtebilirsiniz.
CDN veya Proxy Ayarları
Bazen CDN (Content Delivery Network) veya bir ters proxy (Nginx, Apache gibi) kullanıyorsanız, bu katmanlar istemciye ulaşmadan önce HTTP başlıklarını değiştirebilir veya kaldırabilir. Eğer bu katmanlar `Access-Control-Allow-Origin` veya diğer CORS başlıklarını kaldırırsa, tarayıcıda yine CORS hatası alırsınız.
Çözüm: CDN veya proxy yapılandırmanızı kontrol edin ve CORS ile ilgili başlıkların doğru bir şekilde iletilmesini veya eklenmesini sağlayın.
Google AdSense ve CORS: Dolaylı Etkileşimler
Google AdSense, genellikle kendi komut dosyaları ve içerikleri için CORS sorunlarına neden olmaz çünkü AdSense reklamları iframe'ler içinde yüklenir ve kendi
origin politikası kurallarına göre çalışır. Ancak, web sitenizdeki diğer kaynaklar (resimler, betikler, stil dosyaları veya API çağrıları) nedeniyle oluşan CORS hataları, sitenizin genel performansını ve kullanıcı deneyimini ciddi şekilde etkileyebilir. Bu da dolaylı olarak AdSense gelirinizi olumsuz etkileyebilir.
*
Bozuk Kullanıcı Deneyimi: Eğer sitenizdeki kritik bir resim, video veya interaktif öğe CORS hatası nedeniyle yüklenemezse, kullanıcılar sitenizde olumsuz bir deneyim yaşar. Bu durum, hemen çıkma oranlarını artırabilir, sayfada kalma süresini azaltabilir ve dolayısıyla reklam gösterimlerini veya tıklamalarını olumsuz etkileyebilir.
*
Yavaş Yükleme Süreleri: CORS hataları, tarayıcının kaynakları tekrar tekrar denemesine veya gereksiz hata işleme süreçlerine girmesine neden olabilir, bu da sayfa yükleme sürelerini artırır. Hızlı açılmayan siteler hem SEO açısından dezavantajlıdır hem de kullanıcıların sabrını zorlayarak siteden ayrılmasına neden olur. Bu durum,
AdSense optimizasyonu için kritik bir faktördür.
*
İçerik Eksikliği: Bazı durumlarda, bir CORS hatası nedeniyle sayfanızın önemli bir bölümü yüklenemeyebilir. Bu, kullanıcıların sitenizden tam olarak faydalanamamasına ve potansiyel olarak reklamları görememesine neden olabilir.
Bu nedenlerle, web sitenizdeki CORS hatalarını çözmek, yalnızca teknik bir sorun giderme meselesi değil, aynı zamanda kullanıcı deneyimini iyileştirmek ve dolayısıyla AdSense gelirlerinizi optimize etmek için de önemlidir. Sitenizin sorunsuz çalışması, reklam performansınız için temel bir gerekliliktir. Konuyla ilgili daha fazla bilgi için, sunucu performansının AdSense üzerindeki etkilerini inceleyen "/makale.php?sayfa=sunucu-performansi-adsense-etkisi" makalemize göz atabilirsiniz.
Sonuç ve İleri Adımlar
CORS hatası, modern web geliştirmenin kaçınılmaz bir parçasıdır ve doğru araçlar ve bilgiyle üstesinden gelinebilir. `Access-Control-Allow-Origin` başlığının ne anlama geldiğini ve tarayıcınızın geliştirici araçlarını kullanarak nasıl görüntüleneceğini anlamak, bu tür hataların teşhisinde ve çözümünde ilk ve en önemli adımdır.
Unutmayın ki CORS, bir güvenlik mekanizmasıdır ve doğru yapılandırıldığında web sitenizi potansiyel kötü niyetli saldırılardan korur. Bu nedenle, çözümler uygularken güvenlik en iyi uygulamalarını göz önünde bulundurmak önemlidir. Özellikle `*` joker karakterini kullanmaktan kaçınmak ve belirli kaynaklara izin vermek, uygulamanızın daha güvenli olmasını sağlar.
Bu rehberde öğrendiğiniz
tarayıcı geliştirici araçları kullanarak HTTP başlıklarını inceleme becerisi, sadece CORS sorunlarını çözmekle kalmayacak, aynı zamanda web uygulamalarınızın genel ağ iletişimini ve performansını anlamanıza da yardımcı olacaktır. Sitenizin diğer önemli yönleri, örneğin SEO uyumluluğu ve teknik performans hakkında bilgi almak için "/makale.php?sayfa=teknik-seo-kontrol-listesi" adresindeki rehberimize de bakabilirsiniz. Sistematik bir yaklaşım ve doğru teşhisle, CORS hataları artık bir engel değil, web uygulamanızın güvenliğini ve işlevselliğini artırmak için bir fırsat olacaktır.
Yazar: Tarkan Tevetoğlu
Ben Tarkan Tevetoğlu, bir Akademisyen ve Araştırmacı. Platformumuzda teknolojiyi herkes için anlaşılır kılmak, karmaşık konuları basitleştirerek okuyucularımızın günlük yaşamında pratik olarak kullanabileceği bilgiler sunmak, yeni beceriler kazandırmak, farkındalık oluşturmak ve teknoloji dünyasındaki gelişmeleri anlaşılır bir dille aktarmak amacıyla yazıyorum.