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-Token
或X-Requested-With
,你必须将allowed_headers
设置为包含这些 header。你也可以将其设置为['*']
,以允许所有自定义的 header。
注意: 如果你是显式白名单header,则必须包含
Origin
,否则请求将无法被识别为CORS。
选项
选项 | 描述 | 默认值 |
---|---|---|
paths | 你可以为1个或多个路径启用CORS,例如['api/*'] |
[] |
allowed_methods | 匹配请求方法。 | ['*'] |
allowed_origins | 匹配请求源。可以使用通配符,例如 *.mydomain.com 或 mydomain.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_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
。
常见问题
配置错误
确保配置文件中的 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 协议》,转载必须注明作者和本文链接