رفع خطای Access-Control-Allow-Origin (CORS) در Laravel
خطای Access-Control-Allow-Origin متوقف کنندهٔ امنیتی مرورگرها برای جلوگیری از دسترسی غیرمجاز وبسایتها به منابع یکدیگر است.
این خطا زمانی رخ میدهد که مرورگر شما بخواهد از یک دامنه، پروتکل یا پورت متفاوت به سروری دیگر درخواست (HTTP Request) ارسال کند.
در این حالت، مرورگر برای حفظ امنیت، ابتدا بررسی میکند که آیا آدرس مقصد اجازه دسترسی به این آدرس را صادر کرده است یا خیر.
اگر آدرس مقصد هدر Access-Control-Allow-Origin را در پاسخ خود نفرستاده باشد یا آدرس مبدا در آن تعریف نشده باشد، مرورگر جلوی دریافت اطلاعات را میگیرد و این خطا را نمایش میدهد.
برای مثال، اگر Frontend روی:
https://example.com
و API روی:
https://api.example.com
قرار داشته باشد، مرورگر بررسی میکند که آیا API اجازه دریافت درخواست از https://example.com را دارد یا خیر. در صورت عدم اجازه، خطایی مانند زیر نمایش داده میشود:
Access to fetch ... has been blocked by CORS policy
رفع خطا در Laravel نسخه 11 و جدیدتر:
در Laravel 11 و نسخههای جدیدتر، فایل تنظیمات CORS به صورت پیشفرض در پروژه قرار ندارد و برای انتشار آن میتوانید دستور زیر را اجرا کنید:
php artisan config:publish cors
پس از اجرای دستور، فایل زیر ایجاد میشود:
config/cors.php
برای اجازه دسترسی از یک دامنه خاص، مقدار allowed_origins را به شکل زیر تنظیم کنید:
'allowed_origins' => [
'https://example.com',
],
در این مثال، https://example.com را با دامنه Frontend خود جایگزین کنید.
اگر میخواهید API از تمام Originها قابل دسترسی باشد، میتوانید از تنظیم زیر استفاده کنید:
'allowed_origins' => ['*'],
همچنین میتوانید مسیرهایی که باید شامل CORS شوند را در مقدار paths مشخص کنید. برای مثال، اگر API شما در مسیر /api قرار دارد:
'paths' => [
'api/*',
],
پس از اعمال تغییرات، برای اطمینان از اعمال تنظیمات جدید، Cache تنظیمات Laravel را پاک کنید:
php artisan config:clear
سپس سرویس Laravel را مجدد Deploy کنید.
رفع خطا در Laravel نسخه 10 و پایین تر:
در نسخههای قبل از Laravel 11، فایل config/cors.php معمولاً در پروژه وجود دارد و تنظیمات CORS را میتوانید مستقیماً در همین فایل انجام دهید.
برای اجازه دسترسی از یک دامنه خاص، مقدار allowed_origins را تنظیم کنید:
'allowed_origins' => [
'https://example.com',
],
در این مثال، https://example.com را با دامنه Frontend خود جایگزین کنید.
برای اجازه دسترسی از تمام Originها نیز میتوانید از تنظیم زیر استفاده کنید:
'allowed_origins' => ['*'],
در صورت نیاز، مسیرهای API را نیز در paths مشخص کنید:
'paths' => [
'api/*',
],
پس از اعمال تغییرات، Cache تنظیمات Laravel را پاک کنید:
php artisan config:clear
سپس سرویس Laravel را Deploy یا Restart کنید.
نکته: در محیط Production بهتر است به جای استفاده از “*“، فقط دامنههای موردنیاز را در allowed_origins مشخص کنید.