当前位置: 首页 > 知识库问答 >
问题:

Safari:重新加载后:“由于访问控制检查,无法加载Fetch API”

夏侯枫
2023-03-14

我在Safari的CORS系统中遇到了一些奇怪的行为。我有一个从JS Fetch API发送的POST请求,如下所示:

const res = await fetch('http://localhost:8888/myPath', {
  method: 'POST',
  mode: 'cors',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(body)
});

根据Safari的网络监视器,请求标头如下所示:

POST /myPath HTTP/1.1
Accept: */*
Content-Type: application/json
Origin: http://my.domain.com
Content-Length: 335
Accept-Language: en-gb
Host: localhost:8888
User-Agent: Mozilla/5.0...
Referer: http://my.domain.com
Accept-Encoding: gzip, deflate
Connection: keep-alive

以下响应来自服务器:

HTTP/1.1 200 OK
Date: Tue, 28 Jul 2020 19:15:45 GMT
Vary: Origin
Content-Length: 4
Content-Type: application/json
Access-Control-Allow-Origin: http://my.domain.com
Server: uvicorn

不幸的是,我在这台机器上没有Wireshark,Safari也没有显示飞行前的请求。所以我不知道是否有飞行前的情况发生,以及情况如何。

现在的问题是:当我有一个新的浏览器会话(例如,使用私有模式)并访问触发抓取请求的文档时,一切都正常。只有在重新加载页面以再次发送CORS请求后,我才在Safari控制台中看到“由于访问控制检查,无法加载Fetch API”。所以我猜想,这与Safari如何缓存CORS请求/预飞行有关。

在Firefox和Chrome中,我的CORS请求非常有用。

我该如何解决这个问题?

共有3个答案

洪国兴
2023-03-14

在我的例子中,我使用的是http而不是https,这使得Safari不包括我的授权头。

田硕
2023-03-14

对我来说,是广告拦截器打破了这一点。我有一个名为“advertiser_id”的查询参数,我的广告拦截器将其标识为“需要被阻止”。导致问题描述的cors错误。

仅仅禁用adblocker就解决了这个问题。

公羊俭
2023-03-14

我的建议是,如果你能控制你的服务器,就在'http://localhost:8888/myPath/'.

const res = await fetch('http://localhost:8888/myPath/', {
  method: 'POST',
  mode: 'cors',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(body)
});

我建议这样做的原因是我有完全相同的问题。我对这个问题的不同之处在于,它表现为Safari在缓存图像上的飞行前CORS检查失败,其中图像src是一个重定向(Canvas Instructure URL重定向到AWS S3 bucket)。以你的例子来说,我怀疑这与你的本地主机和域有关。com主机名变化。

我的Safari控制台错误是主机页面的主机域被图像源的域拒绝。我希望你的类似。

FetchEvent.respondWith received an error:
TypeError: Cross-origin redirection to <actual image source> 
denied by Cross-Origin Resource Sharing policy: 
Origin <hosted page containing the image src redirect to image source> 
is not allowed by Access-Control-Allow-Origin. 

原始CORS请求是正常的。只是缓存资源的预检失败。我希望这是一个Safari错误,因为如果它是一个功能,Chrome

  1. 在Safari(v13.2,桌面或iOS上有文件缓存)中,转到站点https://cidilabs.instructure.com/courses/3/pages/upload-slash-embed-image-test.我不控制这个公共页面,如果它成为一个断开的链接,我深表歉意。如果您可以访问Canvas LMS,您可以通过Canvas image upload tool将图像上载到模块页面来复制此页面。Canvas将上传的图像作为重定向链接嵌入到S3 bucket
  2. 然后刷新该页面,在缓存的图像上启动飞行前CORS请求,以查看损坏的图像链接
  • 使用带有嵌入式CORS重定向图像的页面时,请始终打开专用浏览器。该问题仅在缓存图像时发生。[对用户来说不是一个实用的解决方案]
 类似资料:
  • 问题内容: 我正在使用Ionic Framework开发应用程序,并且有多个视图。路由名称是 app.view1 和 app.view2 。我使用控制器切换到下一个视图,当我单击返回时,app.view1的控制器不再执行,这在我的应用程序中非常重要。 请告诉我如何在每次路由到控制器时执行它。 问题答案: Ionic缓存视图以提高性能。它使用的功能。 Ionic最多可以缓存10个视图,不仅可以配置它

  • 我目前正在尝试将类加载到我的应用程序中,这样我就可以过滤掉那些不包含任何test/-方法的类。我希望以后在我的应用程序中运行这些测试。 到目前为止,一切都很好-除了我正在使用的(或者可能是任何)似乎没有实际重新加载位于我的应用程序类路径上的类。 更准确地说,我的应用程序的用户首先选择一些源文件。然后将它们复制到临时位置,并将许多正则表达式匹配/替换对应用于原始源文件的副本。接下来,拷贝被编译,然后

  • 我使用的是角度2.0.0-阿尔法.30版本。当重定向到其他路由时,刷新浏览器,其显示无法获取/路由。 你能帮我弄清楚为什么会发生这个错误吗?

  • null t错误显示为: null DataTables警告:表ID=Slave-Requested未知参数'0'用于行0,列0。有关此错误的详细信息,请参阅http://datatables.net/TN/4 null 我通过进行API调用得到的数据如下: 请帮帮我。如果你想要更多的信息就问。

  • 因此,我将Json数据创建为question。Json Json: 和一个带有jQuery的调用函数: 但我会收到控制台错误,如: 无法加载文件:///c:/users/mirosz/desktop/project/test2/question.json:交叉源请求仅支持协议方案:http、data、chrome、chrome-extension、https 我做错了什么?!怎么加载那个文件?!

  • 我有几个路线,每个路线装载3个组件。所有管线上的两个组件都相同。当我在这些路由之间移动时,我希望传递新数据,在组件的某个初始化事件上,我希望填充该组件的数据,以便它反映在UI上。我还想重新触发正在加载的组件的引导动画。我该怎么做呢。因为现在,我不知道在组件的生命周期中,我将在哪里获取数据,并使用这些新数据重新提交组件。具体来说,在myapps/1和/newapp/I中有一个主视图组件和一个侧栏组件