config/cors.php 机翻

配置

默认配置在 config/cors.php 中。你可以发布配置文件到你自己的配置中:

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

从Laravel 9.2开始,这个中间件包含在Laravel/framework中。你可以使用提供的中间件,它应该与此包中提供的中间件和配置兼容。看见https://github.com/laravel/laravel/pull/5825/files更改。

注意: 如果使用自定义的header,比如 X-Auth-TokenX-Requested-With,你必须将 allowed_headers 设置为包含这些 header。你也可以将其设置为 ['*'],以允许所有自定义的 header。

注意: 如果你是显式白名单header,则必须包含Origin,否则请求将无法被识别为CORS。

选项

选项 描述 默认值
paths 你可以为1个或多个路径启用CORS,例如['api/*'] []
allowed_methods 匹配请求方法。 ['*']
allowed_origins 匹配请求源。可以使用通配符,例如 *.mydomain.commydomain.com:* ['*']
allowed_origins_patterns 使用preg_match匹配请求源。 []
allowed_headers 设置 Access-Control-Allow-Headers 响应头。 ['*']
exposed_headers 设置 Access-Control-Expose-Headers 响应头。 []
max_age 设置 Access-Control-Max-Age 响应头。 0
supports_credentials 设置 Access-Control-Allow-Credentials 响应头。 false

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

常见问题

配置错误

确保配置文件中的 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 中禁用某些请求:

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

重复的 header

CORS中间件应该是你添加这些 header 的唯一位置。如果你还在 .htaccess、nginx 或者 index.php 文件中添加头,你将获得重复的 header 和意外结果。

没有跨站请求

如果你不进行跨站请求,也就是说,如果你不从 site-b.com 请求 site-a.com/api,你的浏览器将不会发送 Origin: https://site-b.com 请求头,CORS将被“禁用”,因为 Access-Control-Allow-Origin 标头也将不存在。这是因为请求正在从相同的地方发送,此时不需要保护。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!