CORS hatası: blocked by CORS policy
Kısaca: Tarayıcı, yabancı bir kaynaktan gelen yanıtı engeller, çünkü sunucu bu sayfanın erişimine açıkça izin vermemiştir.
Biraz daha ayrıntılı: Konsoldaki mesaj: Access to fetch at 'https://api.example.com' from origin 'https://my-site.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Bu tarayıcının bir korumasıdır, sunucunun değil: istek ulaştı ama sayfa yanıtı okuyamaz.
Ayrıntılı
Neden var
Aynı kaynak ilkesi (same-origin policy), bir sayfanın (kaynak A) B kaynağındaki verileri okumasını engeller. Bir kaynak protokol, ana makine ve porttan oluşur. CORS, B sunucusunun başlıklar aracılığıyla seçili kaynaklara erişim vermesine izin verir. “Basit olmayan” isteklerde (Authorization’lı JSON, PUT/DELETE) tarayıcı önce bir preflight isteği (OPTIONS) gönderir.
Tipik nedenler
- Sunucu
Access-Control-Allow-Origingöndermiyor. - Kaynak uyuşmuyor (
httpilehttps,wwwile www’suz, başka port, yazım hatası). - Preflight (
OPTIONS) yanıtlanmıyor veya 404/401 dönüyor. Access-Control-Allow-Headersya da-Methods, gönderileni içermiyor.- Çerezler/kimlik bilgileri ile
Access-Control-Allow-Origin*olmamalı veAccess-Control-Allow-Credentials: trueayarlanmalıdır. - Bir hata sayfası (500/502) CORS başlıkları içermez ve CORS hatası gibi görünür.
Çözümler
- Sunucuda izin verilen kaynağı ayarla:
Access-Control-Allow-Origin: https://my-site.comve gerekirse-Methods,-Headers,-Max-Age. (Express:corspaketi; Next.js: route handler’larda/next.config’te başlıklar.) - Preflight
OPTIONS’ı 204 ile yanıtla. - Geliştirmede bir proxy kullan (Vite/Next
rewrites), böylece tarayıcı yalnızca kendi kaynağına hitap eder. - Çerezlerle birlikte
*kullanma; kaynakları izin verilen kaynaklar listesine göre kontrol et ve geri yansıt. - Ağ sekmesine bak (F12): gerçekte hangi yanıt ve hangi başlıklar geri geldi?
Tarayıcı CORS eklentileri yalnızca kendi yerel sorununu “çözer”, kullanıcıların sorununu değil.
Ayrıca bak: CORS, HTTP başlıkları