- Konu sahibi
- #1
Cloudflare CORS hatası nedir?
Cloudflare arkasındaki bir API’de CORS hatası, yanıtın origin uygulamasından mı yoksa Cloudflare katmanından mı geldiği ayrılarak çözülür. Önce isteğin gerçekten API sunucusuna ulaşıp ulaşmadığını kontrol edin. Yanıt bir Cloudflare güvenlik sayfası, yönlendirme, hata sayfası veya eksik
OPTIONS yanıtıysa sorun origin sunucusu ile Cloudflare arasındaki yapılandırmada aranmalıdır.CORS, farklı kaynaktan gelen yanıtın JavaScript tarafından okunmasını düzenler; API için kimlik doğrulama veya ağ erişim denetimi değildir. Örneğin
https://app.example.com üzerinden https://api.example.com adresine yapılan istek farklı origin kabul edilir. API yanıtı, izin verilen origin'i açıkça belirtmelidir:
Kod:
Access-Control-Allow-Origin: https://app.example.com
İstek özel bir HTTP yöntemi veya özel başlık içeriyorsa tarayıcı önce
OPTIONS yöntemiyle preflight isteği gönderir. API bu isteğe uygun durum kodu ve başlıklarla cevap vermezse asıl GET veya POST isteği hiç gönderilmeyebilir.Önce hatanın kaynağını ayırın
Tarayıcı geliştirici araçlarında Network sekmesini açın ve başarısız isteği inceleyin. Özellikle istek yöntemi, durum kodu,
Response Headers bölümü ve varsa OPTIONS isteği kontrol edilmelidir. Aşağıdaki ayrım, hangi katmanda düzeltme yapacağınızı gösterir:| Gözlenen durum | Muhtemel neden | İlk işlem |
|---|---|---|
| Yanıtta CORS başlığı yok | Origin uygulaması başlık üretmiyor | CORS politikasını API sunucusunda düzeltin |
| OPTIONS başarısız veya 404 | Preflight yöntemi işlenmiyor | OPTIONS isteğine açık yanıt verin |
| Yanıt HTML güvenlik veya doğrulama sayfası | Cloudflare kuralı isteği durduruyor | Olayı güvenlik kayıtlarında inceleyin |
| 301/302 yönlendirmesi | HTTP-HTTPS veya yanlış API yolu | İstemcinin doğrudan doğru HTTPS uç noktasını kullanmasını sağlayın |
| Kimlik bilgileriyle birlikte yıldız başlığı | CORS protokolüyle uyumsuz yanıt | Origin'i açıkça belirtin; yıldız kullanmayın |
Cloudflare yalnızca DNS/proxy katmanında bulunuyorsa kalıcı çözüm genellikle origin uygulamasındadır. Ancak Worker, Transform Rule, cache kuralı, yönlendirme veya güvenlik kuralı yanıtı değiştiriyorsa Cloudflare katmanı da kontrol edilmelidir.
Uygulanabilir teşhis adımları
- İstemcinin gerçek origin'ini belirleyin. Şema, alan adı ve port birlikte değerlendirilir;
http://app.example.comilehttps://app.example.comaynı origin değildir. - Network kaydında önce
OPTIONSisteği olup olmadığını kontrol edin. Bu istek varsaAccess-Control-Allow-Origin,Access-Control-Allow-Methodsve gerekiyorsaAccess-Control-Allow-Headersbaşlıklarını arayın. - İsteği tarayıcıdan bağımsız test edin. Kendi API adresinizi ve istemci origin'inizi kullanarak şu komutu çalıştırın:
Kod:curl -i -X OPTIONS https://api.example.com/resource \ -H 'Origin: https://app.example.com' \ -H 'Access-Control-Request-Method: POST' \ -H 'Access-Control-Request-Headers: Content-Type, Authorization' - Başarılı bir preflight yanıtında, kullanılan origin'e izin veren
Access-Control-Allow-Originbaşlığı ve istenen yöntemi/başlıkları karşılayan izinler bulunmalıdır. Yanıt Cloudflare HTML'i, bir yönlendirme veya 4xx/5xx durum koduysa origin uygulaması ile Cloudflare kuralını ayrı ayrı inceleyin. - CORS politikasını origin uygulamasında düzeltin. İzin verilen origin'i sabit ve açık tanımlayın; üretimde gelen
Origindeğerini kontrol etmeden aynen geri yansıtmayın. - Çerez gibi tarayıcı kimlik bilgileri gönderilecekse istemcinin credentials seçeneğini, açık origin’i ve
Access-Control-Allow-Credentials: truebaşlığını birlikte yapılandırın. Elle eklenen Authorization başlığı için ise ilgili preflight başlık iznini ayrıca kontrol edin.Access-Control-Allow-Origin: *bu kullanım için geçerli değildir. - Cloudflare arkasında bir Worker veya yanıtı değiştiren başka bir kural varsa aynı başlıkların normal yanıtta da korunduğunu kontrol edin. Düzeltmeden sonra yeni bir preflight ve asıl istek kaydıyla tekrar test edin.
Beklenen sonuç,
OPTIONS yanıtının API'den beklenen durum koduyla dönmesi ve tarayıcının istediği CORS başlıklarını içermesidir. Bu sağlandığı halde hata sürüyorsa asıl isteğin yanıtını inceleyin; CORS başlıkları yalnız preflight yanıtında değil, tarayıcının okuyacağı asıl yanıtta da bulunmalıdır. Yanıt 403, 429 veya 5xx ise yalnız CORS başlığı eklemek asıl erişim sorununu çözmez.Cloudflare Access ve CDN önbelleğini ayrı kontrol edin
Access ile korunan bir API’ye gönderilen preflight, tarayıcı tasarımı gereği oturum çerezini taşımaz. Bu nedenle kullanıcı giriş yapmış olsa bile Access katmanı OPTIONS isteğini 403 ile durdurabilir. Access uygulamasının CORS ayarlarında, OPTIONS’u origin’e iletme veya Cloudflare’ın uygun preflight yanıtını üretmesi seçeneklerinden mimarinize uygun olanını değerlendirin. Bu işlem asıl API isteğinin kimlik doğrulamasını kaldırmamalıdır; yalnız ilgili uygulama ve kaynakları kapsasın.
Origin’de başlığı düzelttiğiniz hâlde CDN eski değeri gösteriyorsa yalnız normal URL temizliğine güvenmeyin. Cloudflare’ın resmî CORS önbellek yönergesine göre ilgili kaynağın URL’sini değiştirmek veya gerekli başlıklarla hedefli temizleme yapmak gibi yöntemlerle yeni başlıkların çekildiğini doğrulayın. Önce yalnız etkilenen kaynağı inceleyin; bütün site önbelleğini gereksiz yere boşaltmayın.
Cloudflare proxy’sini kapatmak yerine Ray ID, istek zamanı, yanıt gövdesi ve güvenlik olayını eşleştirerek hangi kuralın yanıt verdiğini belirleyin. Worker, Transform Rule ve origin aynı CORS başlığını ayrı ayrı ekliyorsa birden fazla çelişkili değer de oluşabilir; politikayı hangi katmanın yönettiğini netleştirin.
Sık sorulan sorular
CORS hatası yalnızca aynı alan adında çalışıyor, alt alan adında neden çıkıyor?
Alt alan adları farklı origin sayılır. API, sayfanın bulunduğu origin'i izin verilenler arasına almalı; ayrıca kullanılan şema ve port da doğru olmalıdır.
Cloudflare SSL ayarı CORS hatasına neden olabilir mi?
SSL uyumsuzluğu çoğunlukla CORS'tan önce bağlantı veya yönlendirme hatası oluşturur. Tarayıcıda görülen son yanıtın gerçekten API yanıtı mı, yoksa yönlendirme/hata sayfası mı olduğunu kontrol etmeden yalnız CORS başlıklarını değiştirmeyin.
CORS başlığını yalnızca frontend kodunda ekleyebilir miyim?
Hayır. Tarayıcının güvenlik kararı sunucunun yanıt başlıklarına göre verilir. Frontend kodu isteğin bazı özelliklerini değiştirebilir; izin başlıklarını API veya onu temsil eden güvenilir sunucu katmanı döndürmelidir.