Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
PHP ile CORS açmak için yanıt gönderilmeden önce Access-Control-Allow-Origin başlığını eklemelisiniz. İstek tarayıcı tarafından ön kontrol olarak gönderiliyorsa OPTIONS isteğine de izin verilen yöntemleri ve başlıkları döndürmelisiniz. Belirli bir web uygulamasına hizmet veren API için uygun bir başlangıç, gelen Origin değerini sabit bir izin listesinde kontrol edip yalnızca eşleşen kaynağı yanıt başlığına yazmaktır.

CORS nasıl çalışır?​


CORS, farklı origin'lerden yapılan tarayıcı isteklerinin sunucu tarafından açıkça kabul edilmesini sağlayan HTTP başlıklarıdır. Origin; şema, alan adı ve portun birleşimidir. Örneğin https://example.com ile https://api.example.com farklı origin kabul edilir.

PHP, CORS kararını kendiliğinden vermez; header() ile HTTP yanıt başlıklarını üretir. Tarayıcı, yanıtı JavaScript'e açıp açmayacağına bu başlıklara göre karar verir. CORS başlığı eklemek, sunucu tarafı kimlik doğrulamasının yerine geçmez. Basit bir çapraz-origin istek, tarayıcı yanıtı okuyamasa bile sunucuda işlenebilir; CORS’u durum değiştiren işlemler için tek savunma yapmayın.

Çalıştırılabilir en küçük PHP örneği​


Aşağıdaki dosyayı API uç noktanızın başında çalıştırın. İzin verilen istemciyi gerçek uygulamanızın origin'iyle değiştirin; örnekte yalnızca https://example.com kullanılmıştır.

PHP:
<?php
declare(strict_types=1);

$allowedOrigins = [
    'https://example.com',
];

$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
header('Vary: Origin', false);

if (in_array($origin, $allowedOrigins, true)) {
    header('Access-Control-Allow-Origin: ' . $origin);
    header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
    header('Access-Control-Allow-Headers: Content-Type, Authorization');
}

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(204);
    exit;
}

header('Content-Type: application/json; charset=utf-8');
echo json_encode(['ok' => true], JSON_THROW_ON_ERROR);

Bu örnek cookie/oturum taşımayan bir JSON tanı yanıtıdır; gerçek veriyi okuma veya değiştirme yetkisi ayrıca uygulanmalıdır. Cookie gerekiyorsa izinli origin yanıtında Access-Control-Allow-Credentials: true ve istemcide uygun credentials ayarı gerekir. Bu başlıklar CSRF kontrolünü kendiliğinden kurmaz.

Dosyayı örneğin api.php olarak yayınlayın ve aynı dosyanın üst kısmında, herhangi bir HTML çıktısından veya boşluk üreten include işleminden önce çalıştırın. Başarılı bir istekte yanıt başlıklarında Access-Control-Allow-Origin: https://example.com görülür; ön kontrol isteğinde ise HTTP 204 yanıtı alınır.

Başlıkları hangi durumda kullanmalısınız?​


İhtiyaç, istek türüne göre değişir:
İhtiyaçGerekli başlık veya işlemKarar
Sadece tek bir istemci origin'iAccess-Control-Allow-Origin: belirli-originİzin listesinden eşleşen origin'i döndürün
Cookie veya oturum kullanımıAccess-Control-Allow-Credentials: trueWildcard (*) kullanmayın; belirli origin döndürün
JSON POST, Authorization veya özel başlıkOPTIONS yanıtı; Allow-Methods ve Allow-HeadersÖn kontrol isteğini 2xx yanıtla tamamlayın
Herkese açık ve kimliksiz kaynakAccess-Control-Allow-Origin: *Cookie tabanlı kimlik doğrulamayla birlikte kullanmayın
Örneğin JavaScript istemcisi Authorization başlığı gönderiyorsa, ön kontrol yanıtında Access-Control-Allow-Headers: Authorization bulunmalıdır. Preflight ile sorgulanan yöntem POST ise Access-Control-Allow-Methods içinde POST yer almalıdır. İhtiyaç olmayan yöntem ve başlıkları listeye eklemeyin.

Sık yapılan hatalar ve teşhis​

  1. header() çağrısını geç yapmak: PHP dosyasında başlık çağrısından önce çıktı oluşursa başlık gönderilemez. headers_sent() ile kontrol edin ve dosyanın başında gereksiz boşluk bırakmayın.
  2. Gelen origin'i doğrudan yansıtmak: HTTP_ORIGIN değerini doğrulamadan Access-Control-Allow-Origin olarak döndürmeyin. Sabit bir izin listesi kullanın.
  3. Wildcard ile credential kullanmak: Cookie veya kimlik bilgisi gerektiren isteklerde * yerine eşleşen belirli origin'i döndürün.
  4. Sadece GET yanıtını düzeltmek: Tarayıcının gönderdiği OPTIONS isteği ayrı bir istektir. Bu isteği API yönlendirmesinde veya PHP kodunda engellemeyin.
  5. Sunucu hatasını CORS sanmak: Tarayıcı konsolundaki CORS mesajının yanında Network sekmesinde gerçek HTTP durumunu inceleyin. 401, 403 veya 500 yanıtı varsa önce API hatasını düzeltin; CORS başlığı hatayı ortadan kaldırmaz.
Origin listesine portu da yazın; http://example.com ile https://example.com aynı kabul edilmez. Birden fazla istemci varsa her birini ayrı dizi elemanı olarak ekleyin. API birden fazla origin'e göre farklı yanıt veriyorsa ara önbelleklerin yanlış yanıtı paylaşmaması için sunucu ve önbellek katmanındaki cache davranışını ayrıca kontrol edin.

Sık sorulan sorular​

allowedHeaders ile exposedHeaders neden farklıdır?​

HTTP karşılıkları olan Access-Control-Allow-Headers istemcinin preflight sırasında sorduğu gönderim başlıklarına izin verir. Access-Control-Expose-Headers ise JavaScript’in okuyabileceği ek yanıt başlıklarını belirtir. Örneğin Authorization göndermek ile Content-Disposition okumak iki ayrı yöndeki ihtiyaçtır.

Vary: Origin neden kodun izin kontrolü dışında?​

Origin’e göre yanıtın başlıkları değiştiği için önbelleğin bu farkı bilmesi gerekir. Hem izinli hem izinsiz origin sonuçlarının yanlış paylaşılmasını önlemek amacıyla vary bilgisi üretilir. Bu bilgi tek başına özel yanıtları herkese açık önbelleğe uygun yapmaz; oturum/veri önbellek politikası ayrıca gerekir.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.