Kısa cevap
CORS hatası, sunucu uygun `Access-Control-Allow-Origin` başlığını göndermediği için tarayıcının başka bir alan adına yapılan isteği engellemesiyle oluşur. Çözüm sunucudadır: izin verilen origin, yöntemler ve başlıkları ekleyin veya geliştirme sırasında proxy kullanın. Frontend'de bu hatayı atlatmaya çalışmayın.
Sorun nasıl anlaşılır
- Tarayıcı konsolunda şu yazar: "Access to fetch at ... has been blocked by CORS policy"
- API çağrısı Postman veya curl'de çalışır ancak tarayıcıda çalışmaz
- Ağ isteği Network sekmesinde 0 veya (failed) durumundadır
- Yalnızca yerel geliştirme sunucusunda görünür, üretimde görünmez
- Yeni bir alan adı veya alt alan adı eklendikten sonra hata oluşur
En yaygın nedenler
Access-Control-Allow-Origin eksik
Sunucu `Access-Control-Allow-Origin` başlığını göndermiyor veya sayfanın origin'iyle eşleşmeyen bir değer gönderiyor. Tarayıcı bu durumda yanıtı okumayı engeller.
Yanlış origin veya kimlik bilgileriyle wildcard
`credentials: 'include'` kullanıyorsanız, sunucu `*` değil tam origin döndürmelidir. Ayrıca `http://localhost:3000` ve `http://127.0.0.1:3000` farklı origin'lerdir.
Preflight isteği işlenmedi
Standart dışı yöntemler veya başlıklar için tarayıcı önce OPTIONS isteği gönderir. Sunucu OPTIONS isteğine uygun başlıklarla yanıt vermezse, ana istek gönderilmez.
Proxy veya barındırma başlıkları iletmiyor
Ters proxy (Nginx, Apache) veya sunucusuz platform CORS başlıklarını kaldırabilir ya da kendi hata sayfasını döndürebilir. Proxy yapılandırmasını kontrol edin.
Yanlış API URL'si
Frontend yanlış alan adı, alt alan adı veya bağlantı noktasını çağırıyorsa, sunucu bu origin'e izin vermiyor olabilir. Koddaki tam URL'yi ve sunucudaki izin verilen origin listesini kontrol edin.
Adım adım çözüm
- 1
Tarayıcıda tam origin'i kontrol edin
DevTools'u (F12) açın ve konsola
location.originyazın. Tam değeri not edin, örneğinhttp://localhost:3000. Network sekmesinde başarısız isteği bulun ve istek ile yanıt başlıklarını inceleyin. İstektekiOriginve yanıttakiAccess-Control-Allow-Originbaşlıklarına dikkat edin. - 2
Sunucuda CORS'u yapılandırın
Backend'de frontend'in origin'ine açıkça izin verin. Node.js/Express'te:
app.use(cors({ origin: 'http://localhost:3000', credentials: true })). Spring Boot'ta:@CrossOrigin(origins = "http://localhost:3000")veya genel yapılandırma. ASP.NET Core'da:builder.Services.AddCors(...)veapp.UseCors(...). Kimlik bilgileri kullanıyorsanız her zaman tam origin belirtin,*kullanmayın. - 3
OPTIONS preflight isteğini işleyin
Sunucunun OPTIONS isteğine
Access-Control-Allow-MethodsveAccess-Control-Allow-Headersbaşlıklarıyla 204 veya 200 döndürdüğünü kontrol edin. Express'tecorsara yazılımı bunu otomatik yapar. Nginx'teadd_header Access-Control-Allow-Origin ...veif ($request_method = OPTIONS) { return 204; }ekleyin. - 4
Yerel geliştirme sırasında proxy kullanın
Sunucuyu değiştiremiyorsanız, geliştirme aracında proxy yapılandırın. Vite'ta:
vite.config.jsiçindeserver.proxy. Create React App'te:package.jsoniçindeproxyalanı. Ardından tam URL yerine göreli yoldan (/api/...) API'yi çağırın. - 5
Üretimde CORS'tan kaçının
En iyi çözüm, frontend ve API'nin aynı origin'de (aynı alan adı ve bağlantı noktası) olmasıdır. Değilse,
/apiyolunu backend'e ileten bir ters proxy kullanın. Böylece tarayıcı cross-origin istek göndermez. - 6
Proxy ve barındırma yapılandırmasını kontrol edin
Nginx, Apache veya bulut barındırma kullanıyorsanız, CORS başlıklarını kaldırmadıklarından emin olun. Nginx'te doğru düzeyde
proxy_passveadd_headerkullanın. Sunucusuz platformlarda (Vercel, Netlify) fonksiyonların yanıt başlıklarında veya ilgili yapılandırmada CORS'u ayarlayın. - 7
curl ile test edin
Preflight'ı simüle edin:
curl -i -X OPTIONS http://localhost:8080/api/podaci -H "Origin: http://localhost:3000" -H "Access-Control-Request-Method: GET". YanıtınAccess-Control-Allow-OriginveAccess-Control-Allow-Methodsiçerip içermediğini kontrol edin. İçermiyorsa sorun sunucudadır. - 8
Önbelleği temizleyin ve yeniden yükleyin
Tarayıcılar preflight yanıtlarını
Access-Control-Max-Agebaşlığına göre önbelleğe alabilir. Süresinin dolmasını bekleyin, tarayıcıyı yeniden başlatın veya sunucuda bu değeri geçici olarak azaltın. DevTools'ta "Disable cache" seçeneğini etkinleştirin ve sayfayı yenileyin. Bazen yapılandırma değişikliklerinin uygulanması için geliştirme sunucusunu yeniden başlatmak gerekir.
Hiçbir şey yardımcı olmazsa: gelişmiş kontroller
Sunucunun CORS başlıklarını yalnızca başarılı yanıtlar için döndürüp döndürmediğini kontrol edin. Uygulama 500 hatası verirse CORS başlıkları eksik olabilir ve tarayıcı gerçek hata yerine CORS hatası bildirir. Bu durumda önce sunucu hatasını düzeltin. Ardından curl veya Postman gibi bir araçla ham yanıtı görün. Yönlendirmelere dikkat edin: sunucu httpyi httpsye yönlendiriyorsa CORS başlıkları kaybolabilir. Son olarak, birden fazla katmanınız (CDN, yük dengeleyici, proxy) olup olmadığını ve bunlardan birinin başlıkları silip silmediğini kontrol edin. Üretimde uygulama çerezler veya yetkilendirme başlıkları kullanıyorsa asla Access-Control-Allow-Origin: * kullanmayın.
Tekrarlanmaması için
- Sunucu yapılandırmasında izin verilen origin listesini tanımlayın ve her alan adı değişikliğinde güncelleyin.
- Mümkün olan her yerde frontend ve API için aynı origin'i veya ters proxy kullanın.
- Yayınlamadan önce CORS davranışını otomatik testler veya curl ile test edin.
- Kimlik bilgileri kullanırken `Access-Control-Allow-Origin` için `*` kullanmaktan kaçının.
Ne zaman uzmana başvurmalı
Tüm adımları denediyseniz ve CORS hatası uygulamayı hâlâ engelliyorsa veya sunucu yapılandırmasına erişiminiz yoksa, IT desteğine veya DevOps ekibine başvurun. Proxy, barındırma ve güvenlik kurallarını kontrol edebilirler.
Yazılım ve ürün geliştirme · Özel uygulamalar, SaaS ve 4-8 haftada MVPSık sorulan sorular
CORS hatası neden Postman'de görünmüyor?
Postman ve curl tarayıcı olmadıkları için CORS kurallarını uygulamaz. CORS bir tarayıcı güvenlik önlemidir, bu nedenle hata yalnızca tarayıcıda görünür. Bu, sorunun ağda değil sunucu başlıklarında olduğunu doğrular.
CORS'u frontend'de çözebilir miyim?
CORS'u frontend'de kalıcı olarak çözemezsiniz çünkü tarayıcı, veriler JavaScript kodunuza ulaşmadan önce yanıtı okumayı veya preflight sırasında isteğin kendisini engeller. Tek çözüm, sunucunun doğru başlıkları göndermesi veya proxy kullanmanızdır.
"Credential is not supported if the CORS header is wildcard" hatası ne anlama gelir?
Bu, sunucu `Access-Control-Allow-Origin: *` döndürürken kimlik bilgileri (örneğin çerezler) gönderdiğiniz anlamına gelir. Tarayıcı buna izin vermez. Sunucu tam origin ve `Access-Control-Allow-Credentials: true` döndürmelidir.