- Konu sahibi
- #1
Laravel'de CORS ayarı, API'ye istek gönderen frontend alan adını açıkça izin verilen origin listesine ekleyerek yapılır. Projede
Tarayıcı, farklı origin'e yapılan basit olmayan isteklerden önce çoğunlukla OPTIONS yöntemiyle bir preflight isteği gönderir. Bu istekte kullanılacak metot ve başlıklar sorulur. Sunucu izin verirse asıl GET, POST veya başka bir istek gönderilir. Yanıt başlıklarının gönderilmesi, tarayıcının bu yanıtı JavaScript'e açacağı anlamına gelir; CORS tek başına kimlik doğrulama veya yetkilendirme sağlamaz.
Örneğin frontend
Cookie veya oturum tabanlı kimlik doğrulama kullanıyorsanız
Yanıtta izin verilen origin, yöntem ve başlıkları kontrol edin. curl tarayıcının CORS politikasını uygulamaz; başlık incelemesi gerçek frontend testinin yerine geçmez. Preflight başarılı olsa bile asıl isteğin kimlik doğrulama veya uygulama hatası ayrıca olabilir.
config/cors.php dosyası varsa aşağıdaki gibi düzenleyin; dosya yoksa önce projenizin sürümünü doğrulayın. Laravel 12 örneğinde php artisan config:publish cors komutu dosyayı yayınlar. Eski projelerde aynı komutun var olduğunu varsaymayın; CORS middleware ve yapılandırma yöntemi sürüme göre kontrol edilmelidir. Bu örnek token kullanan bir API için sınırlı başlangıç ayarıdır; tüm projelere uygulanacak hazır güvenlik politikası değildir.
PHP:
<?php
return [
'paths' => ['api/*'],
'allowed_methods' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
'allowed_origins' => [
'http://localhost:3000',
'https://example.com',
],
'allowed_origins_patterns' => [],
'allowed_headers' => ['Content-Type', 'X-Requested-With', 'Authorization', 'Accept'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => false,
];
Yapılandırmayı uygulama ve kontrol sırası
- Frontend'in gerçek adresini
allowed_originsiçine şema ve portuyla birlikte ekleyin. Örneğinhttp://localhost:3000ilehttp://localhost:5173farklı origin değerleridir. - API rotalarınız
api/*dışında bir prefix kullanıyorsapathslistesine ekleyin. CORS ayarı yalnızca eşleşen yollar için uygulanır. Origin listesi API için bir kimlik doğrulama veya ağ erişim sınırı değildir; tarayıcı dışı istemciler de API'ye istek gönderebilir. - İhtiyaç duyulan HTTP metotlarını ve istemcinin gönderdiği başlıkları
allowed_methodsveallowed_headersiçinde belirtin. - Terminalde
php artisan config:clearçalıştırın. Üretimde yapılandırma önbelleği kullanıyorsanız ardındanphp artisan config:cacheçalıştırın. - Tarayıcı geliştirici araçlarında önce OPTIONS isteğini, sonra asıl API isteğini kontrol edin. OPTIONS yanıtında uygun CORS başlıkları bulunmalı ve hata durumunda sunucu yanıtı ayrıca incelenmelidir.
CORS nasıl çalışır?
Tarayıcı, farklı origin'e yapılan basit olmayan isteklerden önce çoğunlukla OPTIONS yöntemiyle bir preflight isteği gönderir. Bu istekte kullanılacak metot ve başlıklar sorulur. Sunucu izin verirse asıl GET, POST veya başka bir istek gönderilir. Yanıt başlıklarının gönderilmesi, tarayıcının bu yanıtı JavaScript'e açacağı anlamına gelir; CORS tek başına kimlik doğrulama veya yetkilendirme sağlamaz.
Örneğin frontend
https://example.com, API ise https://api.example.com olsun. Frontend Authorization başlığıyla POST /api/orders çağrısı yapıyorsa allowed_origins içinde frontend origin'i, allowed_methods içinde POST, allowed_headers içinde de Authorization bulunmalıdır.| Ayar | Ne için kullanılır | Örnek karar |
|---|---|---|
allowed_origins | Yanıtı okuyabilecek origin'ler | Üretimde yalnızca gerçek frontend alan adı |
allowed_methods | İzin verilen HTTP metotları | API'nin gerçekten kullandığı metotlar |
allowed_headers | İstemcinin gönderebileceği başlıklar | Content-Type, Authorization |
supports_credentials | Cookie veya oturum bilgisinin taşınması | Cookie kullanılıyorsa true |
supports_credentials değerini true yapın ve allowed_origins içinde * kullanmayın; gerçek origin'i açıkça yazın. Ayrıca frontend istemcisinin isteği credentials seçeneğiyle göndermesi gerekir. Sanctum SPA akışında ilgili csrf-cookie yolu, X-XSRF-TOKEN başlığına izin, stateful API ve oturum çerezi ayarları da birlikte kontrol edilmelidir; burada verilen token örneği o kurulumun tamamı değildir. Bearer token kullanan API'lerde çoğu durumda supports_credentials gerekmeyebilir.Preflight yanıtını ayrı okuyun
Aşağıdaki temsilî adresi kendi mevcut API uç noktanızla değiştirin. Komut OPTIONS yanıtını gösterir; sipariş oluşturan POST isteğini göndermez:
Bash:
curl -i -X OPTIONS 'https://api.example.com/api/orders' -H 'Origin: https://example.com' -H 'Access-Control-Request-Method: POST' -H 'Access-Control-Request-Headers: authorization,content-type'
Sık yapılan hatalar
- Origin'e yalnızca alan adını yazmak:
https://example.comileexample.comaynı değer değildir. Şema ve port korunmalıdır. - Yanlış path tanımlamak: CORS ayarı
api/*için yazılmışken isteklerv1/*yoluna gidiyorsa başlıklar eklenmez. - OPTIONS isteğini engellemek: Web sunucusu, proxy veya uygulama katmanı OPTIONS isteğine 404, 405 ya da 401 döndürüyorsa preflight başarısız olur.
- Yapılandırma önbelleğini unutmak: Dosyayı değiştirdiğiniz halde eski ayarlar okunuyorsa önce
config:clearile önbelleği temizleyin. - Sorunu yalnızca Laravel'de aramak: Tarayıcı geliştirici araçlarında yanıt başlıklarını, HTTP durum kodunu ve isteğin gerçekten hangi origin'den çıktığını birlikte kontrol edin.