pedrolimapi/dingo-laravel-cors

此包已被废弃,不再维护。未建议替代包。

为您的 Laravel 应用程序添加 CORS(跨源资源共享)头部支持

v0.8.8 2017-02-14 17:28 UTC

README

基于 https://github.com/asm89/stack-cors

对于 Laravel 4,请使用 0.2 分支

关于

laravel-cors 包允许您使用 ACL 风格的按 URL 配置发送跨源资源共享(CORS)头部。

如果您想了解 CORS 工作流程的全貌,可以查看此 图片

功能

  • 处理 CORS 预检 OPTIONS 请求
  • 向您的响应中添加 CORS 头部

配置

默认值在 config/cors.php 中设置。将此文件复制到您的配置目录中以修改值。您可以使用以下命令发布配置

php artisan vendor:publish --provider="Pedrolimapi\Cors\ServiceProvider"

注意:当使用自定义头部,如 X-Auth-TokenX-Requested-With 时,您必须将 allowedHeaders 设置为包括这些头部。您也可以将其设置为 array('*') 以允许所有自定义头部。

注意:如果您明确列出允许的头部,则必须包括 Origin,否则请求将无法被识别为 CORS。

return [
     /*
     |--------------------------------------------------------------------------
     | Laravel CORS
     |--------------------------------------------------------------------------
     |

     | allowedOrigins, allowedHeaders and allowedMethods can be set to array('*')
     | to accept any value.
     |
     */
    'supportsCredentials' => false,
    'allowedOrigins' => ['*'],
    'allowedHeaders' => ['*'], // ex : ['Content-Type', 'Accept']
    'allowedMethods' => ['*'], // ex: ['GET', 'POST', 'PUT',  'DELETE']
    'exposedHeaders' => [],
    'maxAge' => 0,
    'hosts' => [],
]

allowedOriginsallowedHeadersallowedMethods 可以设置为 array('*') 以接受任何值,但允许的方法必须明确列出。

注意:由于 Laravel 中的 http 方法重写,允许 POST 方法也将使 API 用户能够执行 PUT 和 DELETE 请求。

安装

在您的 composer.json 中要求 Pedrolimapi/dingo-laravel-cors 包,并更新您的依赖项。

$ composer require Pedrolimapi/dingo-laravel-cors

将 Cors\ServiceProvider 添加到您的 config/app.php 提供者数组中

Pedrolimapi\Cors\ServiceProvider::class,

使用

ServiceProvider 添加了一个名为 cors 的路由中间件,您可以使用它来添加 CORS 支持。

Route::group(['middleware' => 'cors'], function(Router $router){
    $router->get('api', 'ApiController@index');
});

如果您想 CORS 应用于所有路由,请将其添加到 app/http/Kernel.php 中的全局中间件

protected $middleware = [
    ....
    \Pedrolimapi\Cors\HandleCors::class
];

Lumen

在 Laravel Lumen 上,使用 LumenServiceProvider

'Pedrolimapi\Cors\LumenServiceProvider',

并手动加载您的配置文件

$app->configure('cors');

常见问题和错误

为了让包正常工作,请求必须是有效的 CORS 请求,并且需要包含一个 "Origin" 头部。

当发生错误时,中间件没有完全运行。因此,在这种情况下,您将看不到实际的结果,而是会收到一个 CORS 错误。

这可能是一个CSRF令牌错误,也可能只是一个简单的问题。

禁用API的CSRF保护

App\Http\Middleware\VerifyCsrfToken中,将您的路由添加到异常中

protected $except = [
  'api/*'
];

调试错误

一个简单但有些不规范的解决方法是始终发送CORS头信息。这不建议在生产环境中使用,但它会显示实际的错误。

将以下内容添加到public/index.php的顶部

header("Access-Control-Allow-Origin: *");

别忘了在生产环境中移除它,这样您就可以指定允许哪些路由/头信息/源。

您还可以在异常处理器中将CORS头信息添加到错误中

public function render($request, Exception $e)
{
    $response = parent::render($request, $e);

    if ($request->is('api/*')) {
        app('Pedrolimapi\Cors\Stack\CorsService')->addActualRequestHeaders($response, $request);
    }

    return $response;
}

许可证

在MIT许可证下发布,请参阅LICENSE。