Angular Service Worker ngsw-config.json S3 / Cloudflare图像缓存CORS错误

如何解决Angular Service Worker ngsw-config.json S3 / Cloudflare图像缓存CORS错误

在Angular 9应用中,当我将此图像缓存代码段添加到ngsw-config.json时,出现CORS错误,并且图像不显示。如果我删除此代码段,则该应用程序可以正常运行(没有错误)。

可从以下位置访问“ https://assets.myurl.net/images/banner.jpg” 来源'https:// localhost:8100'已被CORS政策阻止:否 请求中出现“ Access-Control-Allow-Origin”标头 资源。如果不透明的响应满足您的需求,请设置请求的 模式设置为“ no-cors”,以在禁用CORS的情况下获取资源。

ngsw-config.json(摘要):

"assetGroups": [{
    "name": "cdn","installMode": "lazy","updateMode": "lazy","resources": {
        "urls": [
            "https://assets.myurl.net/**"
        ]
    }
}]

图像存储在具有CORS配置的AWS S3存储桶中:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
</CORSRule>
</CORSConfiguration>
  • Cloudflare被用作CDN(和DNS)。
  • 该应用程序的最新版本为9.x:@angular 9.2.1,@ angular / service-worker 9.1.12。
  • 向img和图片标签添加crossorigin =“ anonymous”似乎没有帮助。

在Chrome / PC中一致地重现错误的步骤:

  1. 清除浏览器缓存
  2. 打开私人/隐身浏览器
  3. 转到网站-图片显示还可以
  4. 单击刷新-不再显示图像-浏览器控制台中出现CORS错误

更新

基于此帖子(S3 not returning Access-Control-Allow-Origin headers?),问题似乎在于服务工作者未在请求标头中发送原始消息(因此S3不发送访问控制标头)。

服务人员请求(从Chrome控制台复制):

Request URL: https://assets.myurl.net/images/banner.jpg
Referrer Policy: strict-origin-when-cross-origin
Provisional headers are shown
Referer: https://localhost:8100/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/85.0.4183.83 Safari/537.36

首先,确保每个请求都带有一个Origin标头。如果没有Origin标头 发送,S3不会发送访问控制标头,因为S3认为它们 无关紧要的(通常是这样)。浏览器(为此使用CORS 机制的意思)将在以下情况下自动发送Origin标头 通过XMLHTTPRequest执行跨域HTTP请求。

基于此帖子(S3 - Access-Control-Allow-Origin Header),S3 cors脚本已更新为包括:

<AllowedMethod>HEAD</AllowedMethod>
<AllowedHeader>*</AllowedHeader>

向img标签添加crossorigin =“ anonymous”不会更改服务工作者请求标头。因此,这不能解决问题。

Cloudflare缓存已清除。

此晦涩的帖子(https://community.cloudflare.com/t/access-control-allow-origin-headers-stripped/158102/2)包括:

如果您在原始Web服务器上添加或更改CORS配置, 通过URL清除Cloudflare缓存不会更新CORS标头。

我通过添加随机查询字符串(例如,banner.jpg?q = abc)来缓存删除banner.jpg图片。标语图像始终正确显示(而其他图像仍显示cors错误)。 Chrome控制台“应用程序标签”>“缓存存储”中的服务工作者缓存显示图像已缓存。 Cloudflare缓存配置“缓存级别” =标准“每次查询字符串更改时都会提供不同的资源”。

cached

但是,如果我将新图像上传到S3 banner01.jpg(即尚未被Cloudflare缓存),则确实会出现显示该图像的错误提示。我通过上传不同的图像尝试了另外三遍图像名称,但未获得cors错误。有趣的是,一个小时后,即使新图像也显示出cors错误。

curl命令(未在标头中指定Origin)在我的本地PC上成功运行。响应不包含CORS标头。例如

curl -v "https://assets.myurl.net/images/banner.jpg"

在curl命令中添加原点并不会返回CORS标头。例如

curl -v --header "Origin: https://www.example.com" "https://assets.myurl.net/images/banner.jpg"

access-control-allow-origin: https://www.example.com
access-control-allow-methods: GET,HEAD
access-control-allow-credentials: true

更新2

我无法解释原因,但是Chrome现在会在Angular Service Worker的获取响应中返回cors标头。该请求不包含Origin标头。

accept-ranges: bytes
access-control-allow-methods: GET,HEAD
access-control-allow-origin: *

但是,Safari没有。所有浏览器似乎都可以正常运行,但是Safari仍然显示错误错误。

解决方法

转到您的S3存储桶。单击权限,然后单击CORS配置。 如果您具有CORS配置,请从此更改允许的来源:

<AllowedOrigin>*</AllowedOrigin>

TO

<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>

如果您没有CORS配置,请添加如下配置:

<CORSConfiguration>
<CORSRule>
    <AllowedOrigin>http://*</AllowedOrigin>
    <AllowedOrigin>https://*</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
</CORSRule>
</CORSConfiguration>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-