manish-pareek/laravel-cors

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

dev-master / 2.0.x-dev 2022-08-15 13:05 UTC

This package is auto-updated.

Last update: 2024-09-15 17:35:42 UTC


README

Build Status Latest Stable Version Software License Total Downloads Fruitcake

实现了 https://github.com/fruitcake/php-cors 用于 Laravel

自 Laravel 9.2 以来,此中间件已包含在 laravel/framework 中。您可以使用提供的中间件,它应与该包中提供的中间件和配置兼容。有关更改,请参阅 https://github.com/laravel/laravel/pull/5825/files

关于

laravel-cors 包允许您通过 Laravel 中间件配置发送 跨源资源共享 头部。

如果您想了解 CORS 工作流程的全局概述,可以浏览此 图片

从 0.x 升级

从 0.x 版本升级时,有一些破坏性更改

  • 使用新的 'paths' 属性来启用/禁用特定路由上的 CORS。默认为空,因此请正确填写!
  • 不再支持分组中间件,请使用全局中间件
  • 供应商名称已更改(参见安装/使用说明)
  • cors.php 中的属性的大小写从 camelCase 更改为 snake_case,因此如果您已经有一个 cors.php 文件,您需要更新那里的属性以匹配新的大小写。

特性

  • 处理 CORS 预检 OPTIONS 请求
  • 将 CORS 头部添加到您的响应中
  • 将路由与只添加 CORS 的某些请求相匹配

安装

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

composer require fruitcake/laravel-cors

如果您遇到冲突,这可能是因为已安装 barryvdh/laravel-cors 或 fruitcake/laravel-cors 的旧版本。首先删除冲突的包,然后再次尝试安装

composer remove barryvdh/laravel-cors fruitcake/laravel-cors
composer require fruitcake/laravel-cors

全局使用

要允许所有路由的 CORS,请在 app/Http/Kernel.php 类的 $middleware 属性顶部添加 HandleCors 中间件

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

现在更新配置以定义要运行 CORS 服务的路径(见下文配置)

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

配置

默认设置在 config/cors.php 中。发布配置以复制文件到您自己的配置

php artisan vendor:publish --tag="cors"

注意:当使用自定义头部,如 X-Auth-TokenX-Requested-With 时,必须将 allowed_headers 设置为包含这些头部。您还可以将其设置为 ['*'] 以允许所有自定义头部。

注意:如果您明确列出白名单头部,则必须包括 Origin 或请求将无法被识别为 CORS。

选项

allowed_originsallowed_headersallowed_methods 可以设置为 ['*'] 以接受任何值。

注意:对于 allowed_origins,如果您不使用通配符,则必须包括方案,例如 ['http://example.com', 'https://example.com']。您还必须考虑到在使用 allowed_origins_patterns 时方案将存在。

注意:尽量具体。您可以从宽松的约束开始开发,但最好是尽可能严格!

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

注意:有时需要指定端口号(例如,当你在本地的开发环境中编写应用程序时)。你可以在这里指定端口号或使用通配符,例如 localhost:3000localhost:* 或者甚至使用一个完全限定的域名 app.mydomain.com:8080

Lumen

在 Lumen 中,只需手动在你的 bootstrap/app.php 文件中注册 ServiceProvider

$app->register(Fruitcake\Cors\CorsServiceProvider::class);

还将 cors.php 配置文件复制到 config/cors.php 并执行

$app->configure('cors');

Lumen 的全局使用

要允许所有路由的 CORS,请将 HandleCors 中间件添加到全局中间件并设置配置中的 paths 属性。

$app->middleware([
    // ...
    Fruitcake\Cors\HandleCors::class,
]);

常见问题

错误的配置

确保配置中的 path 选项是正确的并且确实与您使用的路由相匹配。记得也要清除配置缓存。

错误处理、中间件顺序

有时返回自己响应的错误/中间件可能会阻止 CORS 中间件的运行。尝试更改中间件的顺序并确保它是全局中间件中的第一个条目,而不是路由组的一部分。也要检查日志以获取实际的错误,因为没有 CORS,错误会被浏览器吞没,只会显示 CORS 错误。还尝试在没有 CORS 的情况下运行,以确保它确实有效。

授权头/凭证

如果您的请求包含授权头或使用凭证模式,请将配置中的 supports_credentials 值设置为 true。这将设置 Access-Control-Allow-Credentials 头为 true

输出/退出

如果您在代码中使用 echo()dd()die()exit()dump() 等等,您将破坏中间件流程。当输出在头之前发送时,CORS 无法添加。当脚本在 CORS 中间件完成之前退出时,CORS 头将不会添加。始终返回适当的响应或抛出异常。

为您的 API 禁用 CSRF 保护

如果可能,请使用禁用 CSRF 保护的路由组。否则,您可以在 App\Http\Middleware\VerifyCsrfToken 中为某些请求禁用 CSRF。

protected $except = [
    'api/*',
    'sub.domain.zone' => [
      'prefix/*'
    ],
];

重复头

CORS 中间件应该是唯一添加这些头的地方。如果您还在 .htaccess、nginx 或您的 index.php 文件中添加头,您将得到重复的头和意外的结果。

许可证

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