带有水果蛋糕的 Laravel CORS

IT技术 reactjs laravel react-redux cors laravel-middleware
2021-04-02 05:35:49

laravel后端制作了react项目......我有一个CORS问题,我像下面的链接一样做所有事情,用水果蛋糕。

API 的 Laravel 6 CORS 政策问题, 但仍然无法正常工作。

cors.php:

        'paths' => ['api/*'],

    /*
    * Matches the request method. `[*]` allows all methods.
    */
    'allowed_methods' => ['*'],

    /*
     * Matches the request origin. `[*]` allows all origins.
     */
    'allowed_origins' => ['*'],

    /*
     * Matches the request origin with, similar to `Request::is()`
     */
    'allowed_origins_patterns' => [],

    /*
     * Sets the Access-Control-Allow-Headers response header. `[*]` allows all headers.
     */
    'allowed_headers' => ['*'],

    /*
     * Sets the Access-Control-Expose-Headers response header.
     */
    'exposed_headers' => false,

    /*
     * Sets the Access-Control-Max-Age response header.
     */
    'max_age' => false,

    /*
     * Sets the Access-Control-Allow-Credentials header.
     */
    'supports_credentials' => false,

而且,内核中间件是:

        protected $middleware = [
        \App\Http\Middleware\TrustProxies::class,
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,

        \Fruitcake\Cors\HandleCors::class,
    ];

还有什么问题?

5个回答

以下是使用时的一些问题fruitcake/laravel-cors

  • HandleCors中间件放在$middlewarein的顶部app/Http/Kernel.php
protected $middleware = [
    \Fruitcake\Cors\HandleCors::class,
    \App\Http\Middleware\TrustProxies::class,
    \App\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];

把它放在底部或中间的某个地方是行不通的,因为请求可能会被其他具有更高优先级的中间件拒绝。

  • 千万不要死或控制器退出。

例如以下将不起作用:

Route::get('/cors-test', function() {
   dd("This won't work");
});

因为Fruitcake\Cors\HandleCors::handle方法在处理请求添加了相关的标头

Fruitcake\Cors\HandleCors.php

public function handle($request, Closure $next)
{
    // --- omitted

    // Handle the request
    $response = $next($request); // <--- if you die here

    if ($request->getMethod() === 'OPTIONS') {
        $this->cors->varyHeader($response, 'Access-Control-Request-Method');
    }
    
    // you will never reach here
    return $this->addHeaders($request, $response);
}

dump 也不起作用

  • 更改后清除配置缓存app/config/cors.php
$ php artisan config:cache
在我的情况下是dump一个 FormRequest 方法
2021-06-06 05:35:49

Fruitcake\Cors\HandleCors::class麻烦。只需从任何地方删除它并api.php在顶部的路由文件中添加这 3 个标头

header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token, Authorization, Accept,charset,boundary,Content-Length');
header('Access-Control-Allow-Origin: *');
你能告诉我们为什么“麻烦”吗?您的解决方案无法正确处理预检
2021-06-05 05:35:49
我也在 laravel 7 本身上使用它。就我而言,我尝试了一切。但它没有用。因此,如果您可以使用它,请发布答案。
2021-06-09 05:35:49
它带有一个注册为cors. 对?那么使用它的好主意是什么。通过将其作为路由或路由组中间件。它只是无法添加所需的头文件,直到您将其添加到内核文件中的全局中间件中。
2021-06-10 05:35:49
好的,但这是 Laravel 的做法。顺便说一句,laravel 7 默认使用水果蛋糕组件,所以没有理由避免它。您这样做的方式可能会在预检时给出 404,因此这不是解决方案。
2021-06-20 05:35:49

credentials: 'same-origin'在react应用程序中添加到您的请求标头

实际上,只需从您的代码中删除 dd 和 die 命令。

感谢您的回答。事实上,这就是@bravemaster 已经指出的,另一方面,我看不到线程所有者在做什么dd()die()在任何代码示例中。
2021-06-06 05:35:49
php artisan config:clear
php artisan route:clear
php artisan cache:clear

确保您的权限设置正确(例如存储是可写的)