【发布时间】:2020-01-13 07:27:20
【问题描述】:
说明这与其他问题有何不同(已标记为重复。
https://subdomain.domain.com 上的应用程序使用 PHP,它创建签名的 cookie 并发送到客户端。除了 cookie 我尝试设置标题(也尝试过不设置此标题)
header("Access-Control-Allow-Origin: https://subdomain.domain.com");
预期行为:
Access-Control-Allow-Origin : https://subdomain.domain.com
实际行为:
Access-Control-Allow-Origin : *
如果在 s3 中我将 CORS 设置为 <AllowedOrigin>https://subdomain.domain.com</AllowedOrigin>
事情很好。但我也将从 subdomain2 和 subdomain3 访问它。
那么如何根据上下文改变原点呢?
其余部分保持不变,为读者提供更多上下文:
++++++++
Access-Control-Allow-Origin 未设置为正确的来源“https://subdomain.domain.com”
在 Safari(在 Mac 上)上一切正常,视频播放正常。
在 Chrome 和 Firefox 上,我收到以下错误从源“https://subdomain.domain.com”访问“https://media.domain.com/folder/part1/part1.m3u8”处的 XMLHttpRequest 已被 CORS 策略阻止:响应中的“Access-Control-Allow-Origin”标头的值不得为通配符“* ' 当请求的凭据模式为 'include' 时。 XMLHttpRequest 发起的请求的凭证模式由 withCredentials 属性控制。
我已经设置了一个具有所需 CORS 配置的 s3 存储桶。 Cloudfront 分发版将 Origin、Access-Control-Allow-Origin 和 Access-Control-Allow-Methods 列入白名单。 “Forward Cookies”设置为全部。
为包含 .m3u8 和 .ts 文件的文件夹设置签名 cookie
- s3
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
- CF .
CNAME:media.domain.com
自定义通配符 SSL:*.domain.com
两个起源:
subdomain.domain.com
s3 存储桶
三种行为:
- 默认 - 指向 subdomain.domain.com
- *.m3u8 - 指向 s3 存储桶
- *.ts - 指向 s3 存储桶
- JWPlayer
withCredentials: 'true',
onXhrOpen: function(xhr, url) {
xhr.setRequestHeader("Access-Control-Allow-Headers","Content-Type, Accept, X-Requested-With");
xhr.setRequestHeader("Access-Control-Allow-Origin","https://subdomain.domain.com");
xhr.setRequestHeader("Access-Control-Allow-Credentials","true");
}
请求与响应
General:
Request URL: https://media.domain.com/folder/part1/part1.m3u8
Request Method: GET
Status Code: 200
Remote Address: 54.230.71.77:443
Referrer Policy: no-referrer-when-downgrade
Response Headers:
accept-ranges: bytes
access-control-allow-methods: GET, HEAD
access-control-allow-origin: *
access-control-expose-headers: ETag
access-control-max-age: 3000
age: 9566
content-length: 686
content-type: application/x-mpegURL
date: Wed, 11 Sep 2019 09:32:35 GMT
etag: "626d2a3acf31a80ed709de0ddaf8e9a6"
last-modified: Fri, 06 Sep 2019 07:52:42 GMT
server: AmazonS3
status: 200
vary: Origin,Access-Control-Request-Headers,Access-Control-Request-Method
via: 1.1 5324246cfb52c8bfaf71104a45e6ce53.cloudfront.net (CloudFront)
x-amz-cf-id: LJ9F80PYJsSXkl-QO-nKFrRdqK8Hsy6Hc8dZ49t75bsx6u9RFmspzw==
x-amz-cf-pop: BLR50-C1
x-cache: Hit from cloudfront
Request Headers:
Provisional headers are shown
Origin: https://subdomain.domain.com
Referer: https://subdomain.domain.com/test/testcfurl
Sec-Fetch-Mode: cors
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36
在 Safari(在 Mac 上)上,请求的视频可以正常播放。
Chrome 和 Firefox 给出错误“当请求的凭据模式为 'include' 时,响应中的 'Access-Control-Allow-Origin' 标头的值不能是通配符 '*'”
感谢任何帮助。 已经尝试过hls.js CORS using AWS Cloudfront issues with Cookies中提到的所有内容
【问题讨论】:
标签: amazon-s3 cors amazon-cloudfront jwplayer http-live-streaming