nginx - 如何让 CORS 为从 Cloudfront 加载的图像和运行 NGINX 的服务器工作?
问题描述
我试图弄清楚如何正确地让 CORS 处理我们网站的所有图像 - 这样我们就可以使用我正在构建的 PWA 的 WorkBox 缓存它们。
我们目前的设置如下 -
我的主站点正在运行,https://www.MyAwesomeSite.com
并且我已将 AWS Cloudfront 配置为通过 URL 提供我们所有的静态资产(js、css 和图像)https://data.MyAwesomeSite.com/
。
我的 PWA 几乎准备就绪 - 除了opaque
响应(来自 Cloudfront 的所有图像)按预期超出缓存大小。也就是说,实际缓存大小约为 200KB - Chrome 报告它约为 300 - 400 MB。
在调查这个问题时,我发现 Workbox 有时可能会缓存不透明的响应,这会导致缓存大小问题。
在阅读了多篇关于 CORS 的帖子和文章后 - 我仍然不确定是否需要在我的服务器上运行的 NGINX 上启用 CORS 或在 Cloudfront 上配置它。
我的第一种方法:
我尝试按照以下指南在我的 NGINX 服务器上启用 CORS:https ://enable-cors.org/server_nginx.html 。但是,按原样使用代码会导致整个站点显示 404 错误。
为了调查这个新问题,我发现if
里面的块location
不可靠,不推荐使用。我尝试使用maps
函数,但它不起作用。我在 NGIX 上启用 CORS 的最后一种方法是:
server {
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 http2 ssl; # managed by Certbot
root /path/to/my/files;
server_name www.MyAwesomeSite.com;
index index.php index.html index.htm index.nginx-debian.html;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
client_max_body_size 32M;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# Rest of the configuration
虽然我不确定这种方法是否正确——以及它是否真的是正确的方法;我确实在从我的服务器加载的视图的常规 GET 请求中看到了新标头
我的第二种方法
然后,我尝试在 AWS 技术支持的帮助下在我的 Cloudfront 上设置 CORS,它似乎按预期工作。
然后为了解决我最初的问题,我按照谷歌的建议添加crossorigin="anonymous"
到我网站上的所有图像标签中。
但这导致了一个新的问题!
添加到crossorigin="anonymous
所有图像中;我发现 Chrome 会随机消失图像,说明响应中不存在“Access-Control-Allow-Origin”标头。
我的主要问题如下 -
我的所有图像都没有通过 XHR 请求加载。我还需要CORS吗?如果我这样做 - 我应该在我的 NGINX 或 Cloudfront 上启用它吗?
如何确保为我的 PWA 缓存图像资产,而不会真正炸毁缓存?
我错过了什么重要的事情吗?
我真的很感谢任何帮助我解决这个问题的人。自过去 72 小时以来,我一直在尝试解决这个问题,但没有任何成功。
解决方案
您从不同来源访问的来源需要启用跨域请求。
也就是说,如果您希望在脚本中读取该数据,您的 CloudFront 配置data.myawesomesite.com
需要具有适当的Access-Control-Allow-Origin
标头和相关标头(如有必要),以允许来自加载的站点的请求。www.myawesomesite.com
推荐阅读
- snmp - NET-SNMP SNMPTable 在一台计算机上工作,而不是在另一台计算机上工作-相同的文件
- spring-boot - 在 Spring Boot Web Flux 中映射 N 个单声道调用
- python - Heroku Django 部署 PyGObject 和 PyICU 无法造轮子
- c# - 如何为 DataTable.RowChanged 事件代码设置 DataContext
- docker - 运行命令 apt update (tensorflow/tensorflow:1.5.0-devel-gpu-py3) 时,Docker 容器卡在 0% [Working]
- node.js - 在 mac bigsur M1 上运行 npm install 时出错
- amazon-web-services - 如何阻止对 /actuator aws 的所有请求
- python - 尽管在 VSCode 中安装了 pywin32,但无法导入 win32com.client
- flutter - 在 Flutter 包中使用自定义图标字体显示问号而不是自定义图标
- c++ - 从字符串值构建一个带有十六进制字节的 char 数组