microweber-deps/laravel-cors

fruitcake/laravel-cors 的分支,为 Laravel 应用程序添加 CORS (跨源资源共享) 头支持

v3.1 2024-01-26 17:04 UTC

This package is auto-updated.

Last update: 2024-08-26 18:21:14 UTC


README

Build Status Latest Stable Version Software License Total Downloads Fruitcake

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

关于升级到 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,请在 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:*或甚至使用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保护的route group。否则,您可以在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