我在 Cloudflare R2 存储中存储了一些对象(
.zip
和 .json
文件),它们用于通过我的网站向用户动态提供内容。这对当前的问题并不重要,但 .json
提供了从中获取压缩到 zip 文件中的内容的字节范围。
无论如何,既然我已经为 R2 存储桶配置了 CORS(将存储桶连接到我的子域后),那么一切都可以在 Chrome 和 Vivaldi 浏览器上正常运行。
我尝试了很多 CORS 配置,但这是我当前的配置。在这篇文章中,我已经添加了我的研究指出的所有内容,但并非所有这些规则都需要使其在 Chrome 中加载(并且没有一个对 Firefox 有所帮助)。子域
arts.example.com
是用于我的存储桶的子域,加载该内容的页面是 example.com
[
{
"AllowedOrigins": [
"http://example.com",
"https://example.com",
"http://arts.example.com",
"https://arts.example.com",
"http://www.example.com",
"https://www.example.com"
],
"AllowedMethods": [
"GET",
"HEAD",
"POST"
],
"AllowedHeaders": [
"Access-Control-Allow-Origin: http://example.com",
"Access-Control-Allow-Origin: https://example.com",
"Access-Control-Allow-Origin: http://arts.example.com",
"Access-Control-Allow-Origin: https://arts.example.com",
"Access-Control-Allow-Headers: Content-Type, Origin, Accept, Authorization, Content-Length, X-Requested-With, User-Agent",
"Content-Type: application/json",
"Content-Type: application/zip",
"Content-Type: application/octet-stream",
"Access-Control-Allow-Credentials: true"
],
"ExposeHeaders": [
"Content-Encoding",
"Content-Type",
"Cache-Control",
"Content-Length"
],
"MaxAgeSeconds": 300
}
]
我知道类似的问题已经被问过很多次了,但我无法使用它们来实现我的目标。也许我错过了一些东西,但答案似乎都涉及我已经设置的 CORS 标头,或者问题是由第 3 方隐私扩展引起的。我没有使用任何隐私扩展。
在 Firefox 中,预检请求和主请求都存在问题。
预检问题,请求
OPTIONS /onion/edz.zip HTTP/2
Host: arts.example.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Access-Control-Request-Method: GET
Access-Control-Request-Headers: range
Referer: https://example.com/
Origin: https://example.com
Connection: keep-alive
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
Pragma: no-cache
Cache-Control: no-cache
TE: trailers
预检问题,回复:
HTTP/2 403 Forbidden
date: Mon, 11 Mar 2024 10:52:55 GMT
content-type: text/html
vary: Accept-Encoding
cf-cache-status: DYNAMIC
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=pscazcsNDW4dUrFlJWHnnN8j6gQo6xJY0im4g8voNvUp%2BS2OQ6QUzroL4zs%2BhE6xeN5bbGJZzuS4VHqQwBX7PCt9VeMjjfLCuQ20%2F7OibhJr2NSm1%2FD8yzhjAEJyA2Mf8Lk%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 862aff6d9ab00f4b-EWR
content-encoding: br
alt-svc: h3=":443"; ma=86400
X-Firefox-Spdy: h2
主要请求(无回应):
GET /onion/edz.zip undefined
Host: arts.example.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br, identity
Range: bytes=16174665-16250125
Origin: https://example.com
Connection: keep-alive
Referer: https://example.com/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
相比之下,这些是与问题
.json
文件位于同一存储桶中的 .zip
文件的 Firefox 请求和响应标头。
预检:我没有看到针对
.json
的预检“选项”请求
主要要求:
GET /onion/edz.json HTTP/2
Host: arts.example.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Origin: https://example.com
Connection: keep-alive
Referer: https://example.com/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
Pragma: no-cache
Cache-Control: no-cache
回应:
HTTP/2 200 OK
date: Mon, 11 Mar 2024 11:16:58 GMT
content-type: application/json
access-control-allow-origin: https://example.com
etag: W/"01c68f37004a7409fffd99cd8f9d05f6"
last-modified: Sat, 09 Mar 2024 16:34:21 GMT
vary: Origin, Accept-Encoding
access-control-expose-headers: Content-Encoding,Content-Type,Cache-Control,Content-Length
cf-cache-status: DYNAMIC
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=XXXXXXXXXXXXXXXXXXXXXXXXX"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: XXXXXXXX-EWR
content-encoding: br
alt-svc: h3=":443"; ma=86400
X-Firefox-Spdy: h2
我怀疑 Firefox 有一个问题,因为我正在尝试从
.zip
文件提供内容,除了告诉用户不要使用 Firefox 之外,可能没有什么可做的(在我看来,这不是一个真正的选择) .
我想做的事情是不可能的吗?
如果没有,我还可以尝试其他 CORS 设置吗?
nginx
(为我的网站提供服务的反向代理)中是否有任何配置可能会产生影响?我尝试从 nginx
添加标头,但我尝试的任何方法都没有帮助(而且我怀疑问题是否来自 Nginx)
编辑:我想我可能已经找到了Cloudflare文档的相关部分,我将更新这是否是我想要的。
更新1:上面链接的文档似乎有点过时,因为界面已经改变,但我正在尽力遵循它。到目前为止,我所做的就是破坏 Chrome 和 Firefox 的一些东西。如果有某种方法可以让 Firefox 工作而无需在其中添加整个 Cloudflare 应用程序层,那就太好了。
更新 2:我可能应该提到,我的 nginx 位置块中还有以下内容,如果我理解正确的话,应该涵盖我需要的任何内容:
add_header "Access-Control-Allow-Origin" "https://example.com" always;
add_header "Access-Control-Allow-Origin" "https://arts.example.com" always;
add_header "Access-Control-Allow-Origin" "http://example.com" always;
add_header "Access-Control-Allow-Origin" "http://arts.example.com" always;
add_header "AllowMethods" "GET,POST,HEAD,OPTIONS" always;
add_header "Access-Control-Allow-Headers" "Authorization, Origin, X-Requested-With, Content-Type" always;
更新 3:我与 ChatGPT 聊天,这表明防火墙规则可能是问题所在。目前,Cloudflare 在名为“WAF”(Web 应用程序防火墙)的事物下拥有防火墙规则。我一直在和他们一起尝试允许使用
OPTIONS
方法,但到目前为止还没有成功。但这对我来说很新,所以我可能做得不正确。
更新 4:我怀疑不是 WAF 规则(或缺乏正确的规则)阻止了
OPTIONS
方法,因为我刚刚将它们配置为呈现“托管挑战”(CAPTCHA),但并未呈现。所以我猜测问题发生在预检请求到达 Cloudflare 之前。
好吧,看来问题毕竟出在 nginx 端。通过将
add_header Content-Type application/zip;
添加到我的位置块,修复了 Firefox 预检请求的问题。我以为我已经通过在 application/zip
块中包含 types {}
来解决这个问题,但显然情况并非如此。
现在我的 zip 文件正在下载,而不是执行
range
请求我的 js/ajax 代码,但这完全是另一个问题。