为 Laravel 实现 https://github.com/fruitcake/php-cors
从 Laravel 9.2 开始,这个中间件包含在 laravel/framework 中。您可以使用提供的中间件,该中间件应与此包中提供的中间件和配置兼容。请参阅 https://github.com/laravel/laravel/pull/5825/files 了解更改。
升级步骤:
从你的composer.json中删除"fruitcake/laravel-cors"
在app/Http/Kernel.php
中将FruitcakeCorsHandleCors::class,
替换为IlluminateHttpMiddlewareHandleCors::class,
有关高级用法,请参阅https://github.com/fruitcake/php-cors
。配置保持不变。
laravel-cors
包允许您使用 Laravel 中间件配置发送跨源资源共享标头。
如果您想全面了解 CORS 工作流程,可以浏览此图片。
从 0.x 版本升级时,有一些重大更改:
新的“paths”属性用于在某些路由上启用/禁用 CORS。默认为空,请正确填写!
不再支持组中间件,使用全局中间件
供应商名称已更改(请参阅安装/使用)
cors.php
中 props 的大小写已从camelCase更改为snake_case,因此如果您已经有cors.php
文件,则需要更新其中的props以匹配新的大小写。
处理 CORS 飞行前 OPTIONS 请求
将 CORS 标头添加到您的响应中
匹配路由以仅将 CORS 添加到某些请求
在您的composer.json
中需要fruitcake/laravel-cors
包并更新您的依赖项:
作曲家需要 Fruitcake/laravel-cors
如果出现冲突,可能是因为安装了旧版本的 barryvdh/laravel-cors 或 Fruitcake/laravel-cors。首先删除冲突的包,然后再次尝试安装:
作曲家删除 barryvdh/laravel-cors Fruitcake/laravel-cors 作曲家需要 Fruitcake/laravel-cors
要允许所有路由使用 CORS,请在app/Http/Kernel.php
类的$middleware
属性顶部添加HandleCors
中间件:
protected $middleware = [ FruitcakeCorsHandleCors::class,// ...];
现在更新配置以定义要运行 CORS 服务的路径(请参阅下面的配置):
'路径' => ['api/*'],
默认值在config/cors.php
中设置。发布配置以将文件复制到您自己的配置中:
php artisan 供应商:发布 --tag="cors"
注意:使用自定义标头(例如
X-Auth-Token
或X-Requested-With
时,您必须设置allowed_headers
以包含这些标头。您还可以将其设置为['*']
以允许所有自定义标头。
注意:如果您明确将标头列入白名单,则必须包含
Origin
,否则请求将无法被识别为 CORS。
选项 | 描述 | 默认值 |
---|---|---|
路径 | 您可以为 1 个或多个路径启用 CORS,例如。 ['api/*'] | [] |
允许的方法 | 匹配请求方法。 | ['*'] |
允许的来源 | 匹配请求来源。可以使用通配符,例如。 *.mydomain.com 或mydomain.com:* | ['*'] |
允许的来源模式 | 将请求源与preg_match 进行匹配。 | [] |
允许的标题 | 设置 Access-Control-Allow-Headers 响应标头。 | ['*'] |
暴露的标题 | 设置 Access-Control-Expose-Headers 响应标头。 | [] |
最大年龄 | 设置 Access-Control-Max-Age 响应标头。 | 0 |
支持凭证 | 设置 Access-Control-Allow-Credentials 标头。 | false |
allowed_origins
、 allowed_headers
和allowed_methods
可以设置为['*']
以接受任何值。
注意:对于
allowed_origins
在不使用通配符时必须包含方案,例如。['http://example.com', 'https://example.com']
。您还必须考虑到使用allowed_origins_patterns
时将出现该方案。
注意:尽量具体。您可以在宽松的约束下开始开发,但最好尽可能严格!
注意:由于 Laravel 中的 http 方法重写,允许 POST 方法也将使 API 用户能够执行 PUT 和 DELETE 请求。
注意:有时需要指定端口(例如,当您在本地环境中编写应用程序时) 。您也可以在此处指定端口或使用通配符,例如。
localhost:3000
、localhost:*
甚至使用 FQDNapp.mydomain.com:8080
在 Lumen 上,只需在bootstrap/app.php
文件中手动注册 ServiceProvider:
$app->register(FruitcakeCorsCorsServiceProvider::class);
还将 cors.php 配置文件复制到config/cors.php
并将其付诸实践:
$app->configure('cors');
要允许所有路由使用 CORS,请将HandleCors
中间件添加到全局中间件并在配置中设置paths
属性。
$app->middleware([// ...FruitcakeCorsHandleCors::class, ]);
确保配置中的path
选项正确并且与您正在使用的路由实际匹配。请记住还要清除配置缓存。
有时返回自己响应的错误/中间件可能会阻止 CORS 中间件运行。尝试更改中间件的顺序,并确保它是全局中间件中的第一个条目,而不是路由组。还要检查日志中是否有实际错误,因为如果没有 CORS,错误将被浏览器吞没,仅显示 CORS 错误。还可以尝试在没有 CORS 的情况下运行它,以确保它确实有效。
如果您的请求包含授权标头或使用凭据模式,请将配置中的supports_credentials
值设置为true。这会将 Access-Control-Allow-Credentials 标头设置为true
。
如果您在代码中使用echo()
、 dd()
、 die()
、 exit()
、 dump()
等,则会破坏中间件流程。当输出在标头之前发送时,无法添加 CORS。当脚本在 CORS 中间件完成之前退出时,将不会添加 CORS 标头。始终返回正确的响应或抛出异常。
如果可能,请使用禁用了 CSRF 保护的路由组。否则,您可以在AppHttpMiddlewareVerifyCsrfToken
中禁用某些请求的 CSRF:
protected $ except = ['api/*','sub.domain.zone' => ['前缀/*'], ];
CORS 中间件应该是添加这些标头的唯一位置。如果您还在 .htaccess、nginx 或 index.php 文件中添加标头,您将得到重复的标头和意外结果。
如果您没有进行跨站点请求,这意味着如果您没有从 site-b.com 请求 site-a.com/api,您的浏览器将不会发送Origin: https://site-b.com
请求标头, CORS 将被“禁用”,因为Access-Control-Allow-Origin
标头也将丢失。发生这种情况是因为请求是从同一请求发送的,在这种情况下不需要保护。
根据 MIT 许可证发布,请参阅许可证。