EMZETT.
Giriş yap

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-Origin göndermiyor.
  • Kaynak uyuşmuyor (http ile https, www ile www’suz, başka port, yazım hatası).
  • Preflight (OPTIONS) yanıtlanmıyor veya 404/401 dönüyor.
  • Access-Control-Allow-Headers ya da -Methods, gönderileni içermiyor.
  • Çerezler/kimlik bilgileri ile Access-Control-Allow-Origin * olmamalı ve Access-Control-Allow-Credentials: true ayarlanmalıdır.
  • Bir hata sayfası (500/502) CORS başlıkları içermez ve CORS hatası gibi görünür.

Çözümler

  1. Sunucuda izin verilen kaynağı ayarla: Access-Control-Allow-Origin: https://my-site.com ve gerekirse -Methods, -Headers, -Max-Age. (Express: cors paketi; Next.js: route handler’larda/next.config’te başlıklar.)
  2. Preflight OPTIONS’ı 204 ile yanıtla.
  3. Geliştirmede bir proxy kullan (Vite/Next rewrites), böylece tarayıcı yalnızca kendi kaynağına hitap eder.
  4. Çerezlerle birlikte * kullanma; kaynakları izin verilen kaynaklar listesine göre kontrol et ve geri yansıt.
  5. 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ı