unity3d - 由于缺少 Origin 标头 + CORS,从 S3 下载 Unity3D WebGL 网络失败
问题描述
我在尝试从我们的 S3 CDN 下载资源时遇到了一些问题。
我们似乎在 S3 上正确设置了 CORS。
S3 CORS故障排除指南指出您需要发布“Origin”标头,否则它将忽略所有 CORS 标头:
如果缺少标头,Amazon S3 不会将该请求视为跨域请求,并且不会在响应中发送 CORS 响应标头。
我已经使用 curl 进行了测试,以确保返回相关的 CORS 标头,并且我可以看到只有在发送“Origin”标头时才会返回这些标头。
例如:如果我运行以下命令:
curl -v -H "Origin: http://localhost" https://cdn.myurl.com/mybucket/mystuff.json
我收到以下标题(以及一系列其他信息):
access-control-allow-origin: *
access-control-allow-methods: GET, POST, HEAD
但是,当我不传递 Origin 标头时,这些返回标头会丢失:
curl -v https://cdn.myurl.com/mybucket/mystuff.json
我正在尝试使用 UnityWebRequest 获取请求来拉取数据。当我通过 WebGL 运行我的应用程序时,我可以在调用 request.SendWebRequest() 时看到异常
无法加载https://cdn.myurl.com/mybucket/mystuff.json:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问源“ http://localhost:17936 ”。
我只能假设 UnityWebRequest 没有发送“Origin”标头。
我无法显式设置标题,因为如果这样做,我会收到错误消息:
UnityWebRequest request = UnityWebRequest.Get(uri);
request.SetRequestHeader("Origin", "http://localhost");
InvalidOperationException:无法覆盖系统指定的标头
在这一点上我很困惑。
更新:
@sideshowbarker 提到 Origin 标头是由浏览器自动添加的,所以这对我来说可能是一个红鲱鱼。
他们还建议我需要查看浏览器工具中的请求标头。这是我在浏览器中查看 WebGL 应用程序对该特定对象的请求时看到的内容:
这里有几个我感兴趣的点。
- 在请求标头中,它有一个注释,即显示临时标头。我认为这意味着浏览器工具正在对发送的标头做出最佳猜测?
- 请求成功 - 我收到 200(成功)响应代码。内容长度标头(42)是我期望的正确大小。游戏代码只是基于缺少的 CORS 标头而失败。
- 该图显示了带有注释“(来自磁盘缓存)”的 200 响应代码。我已经清除了我的缓存并重新运行它,并且第一次命中(我的代码重试)没有正确地从缓存中加载,但仍然未能通过 CORS 测试。
我能想到的唯一其他混合工具是我们在 S3 存储桶前使用 CloudFlare。我相信这不会引起问题,因为它应该转发 CORS 标头,但我会绕过 CloudFlare 进行测试。
解决方案
只需将“HEAD”请求添加到亚马逊的 cors 配置中
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET",
"POST",
"HEAD"
],
推荐阅读
- algorithm - 在调车场处理链式一元操作员
- c - 使用未声明的标识符“PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP”
- python - 在 Django 中使用 FreeTDS
- r - 在 R 中使用 geom_density_2d() 时出错:`stat_density2d()` 中的计算失败:带宽必须严格为正
- git - git如何存储版本信息
- powershell - Pester Gherkin 测试:“找不到名为 'PSBoundParameters' 的变量”
- php - 如何改进 Laravel 中特定日期功能的搜索
- python - 查找字符串中字符的索引
- scala - Spark:有条件地将 col1 值替换为 col2
- laravel - Laravel 基于设备的访问策略