camilord/laravel-cors

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

3.0.2 2024-08-09 02:57 UTC

This package is auto-updated.

Last update: 2024-09-09 03:09:32 UTC


README

Build Status Latest Stable Version Software License Total Downloads Fruitcake

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

关于升级到Laravel 9、10或更高版本的用户说明

由于所有受支持的Laravel版本现在都包含核心中的CORS中间件,因此此包已弃用。

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

升级步骤

  1. 从您的composer.json中删除"fruitcake/laravel-cors"
  2. app/Http/Kernel.php中将\Fruitcake\Cors\HandleCors::class,替换为\Illuminate\Http\Middleware\HandleCors::class,

有关高级用法,请参阅https://github.com/fruitcake/php-cors。配置保持不变。

关于

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

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

从0.x(barryvdh/laravel-cors)升级

当从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,请将HandleCors中间件添加到app/Http/Kernel.php类中$middleware属性的顶部

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:*,甚至使用 FQDN 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/die

如果您在代码中使用 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 文件中添加头,您将得到重复的头和意外结果。

没有跨站点请求

如果您没有执行跨站点请求,即如果您不是从 site-b.com 请求 site-a.com/api,则浏览器不会发送 Origin: https://site-b.com 请求头,CORS 将“禁用”,因为也将缺少 Access-Control-Allow-Origin 头。这是因为请求是从同一来源分发的,在这种情况下不需要保护。

许可证

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