Loading...

CDN.com.tr Yardım

Edge'de CORS başlıkları

Bir yayınlama kuralının yanıtlarına Access-Control-Allow-Origin ve diğer CORS başlıklarını ekleyin, preflight (ön kontrol) OPTIONS isteklerini kaynak sunucunuz yanıtlasın ve API'nizin kullandığı metotlara WAF'ta izin verin.

Edge'de CORS başlıkları

Bir yayınlama kuralının yanıtlarına Access-Control-Allow-Origin ve diğer CORS başlıklarını ekleyin, preflight (ön kontrol) OPTIONS isteklerini kaynak sunucunuz yanıtlasın ve API'nizin kullandığı metotlara WAF'ta izin verin.

İlgili rehberler

CORS'un tarayıcıda nasıl işlediği, edge'in reddettiği bir isteğin nasıl okunacağı ve kaynak sunucunuzun edge'den başka neler aldığı.

Arka plan

CORS nedir? Tarayıcının cross-origin isteklere koyduğu kural

Basit istekler, preflight, kimlik bilgileri ve curl testleri.

Rehberi okuyun
Edge'den gelen 403

WAF loglarını oku

Reddedilen bir isteği zamana ya da Reference ID'ye göre bulun ve hangi kuralın engellediğini görün.

Konuyu açın
Kaynak sunucunuz

Origin bağlantısı: gerçek ziyaretçi IP'si, origin'i kilitleme, WebSocket ve zaman aşımı

Kaynak sunucuya gönderilen başlıklar ve bir API'nin ihtiyaç duyduğu WAF metotları.

Konuyu açın

Panel yolu

  1. Yönetim Paneli
  2. Yayınlama Kuralları
  3. Kurallar
  4. Düzenle
  5. Başlıklar
  6. Yanıta başlık ekle

Ön koşullar

  • Diğer sitenin istediği yolları sunan bir yayınlama kuralı.
  • İstek yapan sitenin tam origin'i, örneğin https://app.example.com; herkesin yükleyebileceği dosyalar için *.
  • Preflight isteği gönderen API çağrıları için: kaynak sunucunuz bu yollarda OPTIONS isteklerini 200 ya da 204 ile yanıtlıyor.
  • Sahip ya da editör rolü: izleyici rolündeki kullanıcılar kuralları görebilir ama değiştiremez.

Karar modeli

Herkese açık dosyalar mı, API mi?

Tarayıcının ne gönderdiği, işin nerede yapılacağını belirler.

  • Düz bir GET ile yüklenen fontlar, görseller ve herkese açık JSON: preflight olmaz, kuraldaki Access-Control-Allow-Origin yeterlidir. Hesap geneli görsel optimizasyonu açıkken .jpg, .jpeg ve .png dosyaları yanıt başlıklarını yollarının kuralından değil, alan adının en eski kuralından alır.
  • JSON gövdeli, özel başlıklı ya da PUT, PATCH, DELETE kullanan API çağrıları: tarayıcı önce bir preflight isteği gönderir; bunu kaynak sunucunuz yanıtlar, kural da CORS başlıklarını bu yanıta ekleyebilir.
  • Çerez ya da başka kimlik bilgisi taşıyan istekler: * değil, adı yazılmış tek bir origin ve Access-Control-Allow-Credentials true.

Her başlık edge'den mi, kaynak sunucudan mı?

Her başlık için tek bir kaynak seçin.

  • Edge (kural): önbellekten gelenler dahil her 2xx ve 3xx yanıtında sabit tek bir değer; satır always ile bitiyorsa kaynak sunucunuzun 4xx ve 5xx yanıtlarında da.
  • Kaynak sunucu: istek yapan siteye göre değişen ve Vary: Origin ile gönderilen bir değer.
  • İkisinden de gelen bir başlık: Başlıkları kaldır altında işaretleyin, yalnızca kuralın değeri gitsin.

Adım adım rehber

1

Başlıkları kurala ekleyin

Tek bir web uygulamasının çağırdığı, /api/ altındaki bir API için örnek. Her satıra bir başlık yazın; boşluk içeren bir değer çift tırnak içine yazılır.

  • Yayınlama Kuralları → Kurallar'ı açın ve /api/ kuralında Düzenle'ye basın.
  • Şunu uygula → Başlıklar altında Yanıta başlık ekle alanına her biri ayrı satırda olacak şekilde yazın: Access-Control-Allow-Origin https://app.example.com, Access-Control-Allow-Methods "GET, POST, PUT, OPTIONS", Access-Control-Allow-Headers "Content-Type, Authorization" ve Access-Control-Max-Age 600.
  • Kaynak sunucunuzun da gönderdiği adları Başlıkları kaldır altında işaretleyin.
  • Kuralı kaydet'e basın.

Beklenen sonuç: Kuralda +4 yanıt başlığı gibi bir etiket görünür; edge kuralı sunmaya başladığında sayfada Yayında yazar.

2

API'nin metotlarına WAF'ta izin verin

Site geneli WAF açıkken ve API GET, HEAD, POST ve OPTIONS dışında metot kullanıyorsa gerekir.

  • Kenar çubuğunda Koruma altındaki Güvenlik sayfasını açın.
  • İzin verilen HTTP metotları altında API'nizin ihtiyacına göre PUT, PATCH ya da DELETE'i işaretleyin, OPTIONS işaretli kalsın ve Kaydet'e basın.

Beklenen sonuç: Panel kaydı onaylar; değişiklik 1-2 dakika içinde yayılır.

3

Basit bir isteği ve bir preflight isteğini kontrol edin

curl CORS kurallarını uygulamaz; bu yüzden edge'in ne yanıt verdiğini olduğu gibi gösterir.

  • Uç noktayı bir Origin başlığıyla isteyin.
  • Tarayıcının göndereceği preflight isteğini gönderin: Origin, Access-Control-Request-Method ve Access-Control-Request-Headers başlıklarıyla bir OPTIONS isteği.

Beklenen sonuç: Basit istekte tek bir access-control-allow-origin bulunur. Preflight isteği, izin verilen origin, metotlar ve başlıklarla 200 ya da 204 döner.

cdnctl karşılığı
curl -s -o /dev/null -D - -H 'Origin: https://app.example.com' https://www.example.com/api/items | grep -iE '^(HTTP|access-control)'
curl -s -o /dev/null -D - -X OPTIONS -H 'Origin: https://app.example.com' -H 'Access-Control-Request-Method: PUT' -H 'Access-Control-Request-Headers: content-type' https://www.example.com/api/items | grep -iE '^(HTTP|access-control|x-mt-blocked-by)'

Doğrulama

  • curl -s -o /dev/null -D - -H 'Origin: https://app.example.com' https://www.example.com/api/items | grep -iE '^(HTTP|access-control)' → 2xx ve tek bir access-control-allow-origin: https://app.example.com
  • curl -s -o /dev/null -D - -X OPTIONS -H 'Origin: https://app.example.com' -H 'Access-Control-Request-Method: PUT' -H 'Access-Control-Request-Headers: content-type' https://www.example.com/api/items | grep -iE '^(HTTP|access-control|x-mt-blocked-by)' → access-control-allow-origin, access-control-allow-methods ve access-control-allow-headers ile 200 ya da 204
  • Bir istekte x-mt-blocked-by: cdn-edge-security başlıklı 403 → isteği edge reddetti (WAF ya da IP, ülke, ağ veya hotlink engeli); İzin verilen HTTP metotları'na ve WAF loglarına bakın

Kullanım senaryoları

app.example.com üzerindeki bir web uygulaması www.example.com'dan font, JSON ya da API yanıtı yüklüyor ve tarayıcı bunları CORS hatasıyla engelliyor.

Kısa akış

  1. Yayınlama Kuralları'nı açın, Kurallar sekmesinde diğer sitenin istediği yolları sunan kuralda Düzenle'ye basın; yeni bir yol için Kural ekle'yi kullanın.
  2. Şunu uygula altında Başlıklar'ı açın ve Yanıta başlık ekle alanına her satıra bir başlık gelecek şekilde, iki nokta üst üste koymadan Başlık-Adı değer biçiminde yazın; örneğin Access-Control-Allow-Origin https://app.example.com. Boşluk içeren bir değer çift tırnak içine yazılır.
  3. Kaynak sunucunuz (origin) bu yollar için zaten bir Access-Control-* başlığı gönderiyorsa aynı adı Başlıkları kaldır altında işaretleyin; tarayıcıya tek bir değer ulaşsın.
  4. Kuralı kaydet'e (yeni bir kuralda Kuralı oluştur'a) basın ve sayfada Yayında görünene kadar bekleyin.
  5. API'niz PUT, PATCH ya da DELETE kullanıyorsa ve site geneli WAF açıksa bu metotları Güvenlik sayfasındaki İzin verilen HTTP metotları altında işaretleyin.
  6. Basit bir isteği ve bir preflight isteğini curl ile kontrol edin.

Kontroller

  • Kuralın başlıkları başarılı ve yönlendirme yanıtlarına (2xx ve 3xx), önbellekten gelen yanıtlar dahil, kural yayınlandığı andan itibaren eklenir. always ile biten bir satır, kaynak sunucunuzun 4xx ve 5xx yanıtlarına da eklenir.
  • Preflight OPTIONS istekleri kaynak sunucunuza gider ve hiçbir zaman önbelleğe alınmaz. Kaynak sunucunuz preflight isteğini 200 ya da 204 ile yanıtladığında kuralın başlıkları bu yanıta eklenir; 401, 404 ya da 405 ile yanıtlanan bir preflight, satırı always ile bitmedikçe tarayıcıya bu başlıklar olmadan ulaşır. Parola koruması ya da IP izin listesi olan bir kuralda edge, geçirmediği preflight isteğini kendisi 401 ya da 403 ile yanıtlar.
  • Tarayıcıya tek bir Access-Control-Allow-Origin ulaşmalıdır: iki değer gelirse tarayıcı yanıtı reddeder.
  • Kaynak sunucunuz Access-Control-Allow-Origin değerini istek yapan siteye göre değiştiriyorsa Vary: Origin da göndermelidir. Kuralda Vary başlığı ne derse desin tek önbellek kopyası tut kapalı olduğu sürece edge bu sürümleri ayrı tutar.
  • Başlıkları kaldır altında Access-Control-Request-Method ve Access-Control-Request-Headers işaretsiz kalsın: orada işaretlenen adlar kaynak sunucunuza giden isteklerden de kaldırılır, kaynak sunucunuz ise preflight isteğini yanıtlamak için bu ikisini okur.
  • Site geneli WAF açıkken GET, HEAD, POST ve OPTIONS varsayılan olarak izinlidir. Listede olmayan bir metotla gelen istek CORS başlığı olmayan, X-MT-Blocked-By: cdn-edge-security başlıklı bir 403 alır; tarayıcı bunu CORS hatası olarak gösterir.
  • Hesap geneli görsel optimizasyonu açıkken .jpg, .jpeg ve .png dosyaları kendi yollarının kuralının değil, alan adının en eski kuralının yanıt başlıklarını alır: bu görsellerin CORS başlığını sabit bir Access-Control-Allow-Origin değeriyle o kurala ekleyin. En eski kural sertifika doğrulama kuralıysa bu dosyalar hiçbir kural başlığı almaz.

Sık sorulan sorular

Edge preflight isteklerini kendisi yanıtlıyor mu?

Edge OPTIONS isteklerini kaynak sunucunuza iletir ve hiçbir zaman önbelleğe almaz; bu yüzden preflight isteğini kaynak sunucunuz 200 ya da 204 ile yanıtlamalıdır. Kuralın yanıt başlıkları bu yanıta eklenir: CORS başlıkları kuraldan gelebilir, kaynak sunucunuzun yalnızca OPTIONS isteğini kabul etmesi yeterlidir. İstisna: Parola koruması ya da IP izin listesi olan bir kuralda edge, geçirmediği preflight isteğini kendisi 401 ya da 403 ile yanıtlar.

Tek bir kural birden fazla siteye izin verebilir mi?

Kural her yanıta aynı değeri ekler: * ya da https://app.example.com gibi tek bir origin. Birden fazla origin'e izin vermek için uygulamanız eşleşen origin'i Vary: Origin ile birlikte göndersin; Access-Control-Allow-Origin başlığını kurala eklemeyin. Çerez ya da başka kimlik bilgisi taşıyan istekler * değil, adı yazılmış bir origin ister.

Tarayıcı hâlâ CORS hatası veriyor. Neye bakmalıyım?

Önce tarayıcının ağ panelinde başarısız isteğin durum koduna bakın. X-MT-Blocked-By: cdn-edge-security taşıyan bir 403 edge'den gelir: isteği WAF loglarında bulun, metodu listede yoksa İzin verilen HTTP metotları altında ekleyin. Diğer 4xx ve 5xx yanıtları varsayılan olarak kuralın başlıkları olmadan gelir; önce o yanıtı düzeltin. always ile biten bir satır, örneğin Access-Control-Allow-Origin https://app.example.com always, kaynak sunucunuzun 4xx ve 5xx yanıtlarına da eklenir. Ardından tek bir Access-Control-Allow-Origin geldiğini ve bunun şema dahil istek yapan siteyle eşleştiğini kontrol edin.

API'm PUT, PATCH ya da DELETE kullanıyor. Neyi değiştirmeliyim?

Site geneli WAF açıkken Güvenlik sayfasını açın, metotları İzin verilen HTTP metotları altında işaretleyin ve Kaydet'e basın; değişiklik 1-2 dakika içinde yayılır. Yayınlama Kuralları'nın Güvenlik sekmesindeki İzin verilen istek metotları bağlantısı aynı kartı açar. OPTIONS işaretli kalsın: tarayıcılar preflight için bu metodu gönderir.