S3配置宽松CORS仍出现跨域错误,求排查方案
我之前踩过几乎一模一样的坑,给你梳理几个最容易忽略的排查方向:
确认是否开启了S3静态网站托管
如果你用的是S3对象存储的默认访问URL(比如https://your-bucket.s3.us-east-1.amazonaws.com/your-file.pdf),有时候CORS规则的生效逻辑会有延迟或者异常。试试开启静态网站托管后,用托管域名(格式是https://your-bucket.s3-website-us-east-1.amazonaws.com/your-file.pdf)发起请求,很多时候CORS头会正常返回。这是因为S3的对象存储端点和静态网站托管端点的CORS处理机制略有不同。检查AJAX请求是否触发了预检或带了不兼容的配置
虽然你的CORS规则允许*Origin和GET/HEAD方法,但如果你的AJAX请求设置了withCredentials: true,这和AllowedOrigin: *是冲突的——浏览器会拒绝这种组合,自然也不会返回正确的CORS头。看看你的请求代码里有没有这个配置,如果有,要么把AllowedOrigin改成你前端页面的具体域名,要么去掉withCredentials。验证桶的公开权限是否真的生效
先直接在浏览器地址栏输入PDF的URL,看看能不能直接打开或下载。如果访问被拒绝,说明桶的权限策略或者对象ACL有问题,请求根本没走到返回响应头的阶段,浏览器就会抛出CORS相关的错误(其实本质是权限错误,但浏览器会统一归为CORS问题)。确保桶策略里有允许所有用户执行s3:GetObject的规则,比如:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-bucket/*" } ] }检查请求URL的正确性
如果桶名里包含小数点(比如my.bucket.name),S3的HTTPS证书可能无法覆盖这种格式,导致请求出现SSL错误,浏览器也会伪装成CORS错误提示。试试用HTTP访问(仅限测试)或者确认桶名的格式是否符合S3的证书要求。另外,也要检查URL里的路径、文件名有没有拼写错误。清空浏览器缓存或用无痕模式测试
浏览器有时候会缓存旧的响应头,哪怕你已经更新了CORS规则,缓存的旧头还是会生效。试试清空缓存,或者用无痕窗口发起请求,排除缓存的影响。
内容的提问来源于stack exchange,提问作者MitchEff

