رفع خطای CORS در برنامه‌های Laravel


خطای CORS (Cross-Origin Resource Sharing) یک محدودیت امنیتی در مرورگرها است که جلوی درخواست‌های HTTP از منابع مختلف را می‌گیرد. این خطا ممکن است زمانی رخ دهد که سعی کنید از یک دامنه یا پورت متفاوت به سروری دیگر درخواست ارسال کنید، و معمولاً با پیام خطایی شبیه به Access-Control-Allow-Origin در مرورگر مواجه خواهید شد. در ادامه، به رفع این خطا در فریم‌ورک‌های مختلف، پرداخته شده است:

برای حل این مشکل می‌توانید از راه حل‌‌های قرار داده شده، استفاده کنید.

استفاده از پکیج laravel-cors

در ابتدا، کافیست تا با اجرای دستور زیر، این پکیج را در پروژه خود، در لوکال، نصب کنید:

کپی
composer require fruitcake/laravel-cors

البته اگر که به خطای conflict برخورد کردید؛ کافیست تا پکیج‌های قدیمی مربوطه با ورژن barryvdh یا fruitcake را با اجرای دستور مثال زیر، حذف کرده و مجدداً آن را نصب کنید:

کپی
composer remove barryvdh/laravel-cors fruitcake/laravel-cors
composer require fruitcake/laravel-cors

در ادامه، بایستی، یک middleware به نام HandleCors در ابتدای property به نام middleware$ در فایل app/Http/Kernel.php با محتوای زیر، اضافه کنید:

کپی
protected $middleware = [
  \Fruitcake\Cors\HandleCors::class,
    // ...
];

تمامی کارها انجام شده است و کافیست دستور زیر را اجرا کنید تا مقادیر پیش‌فرض مربوط به CORS در مسیر config/cors.php برای‌تان قرار بگیرد و پس از آن، می‌توانید این مقادیر را بنا به نیاز خود، تغییر دهید:

کپی
php artisan vendor:publish --tag="cors"

تنظیم فایل htaccess.

کافیست تا وارد فایل public/.htaccess شوید و تنظیمات مربوط به CORS را به پروژه خود اضافه کنید:

کپی
Header set Access-Control-Allow-Origin "*"

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>