CORS 规则适用于 Chrome,但不适用于 Firefox,但仅适用于某些文件类型

问题描述 投票:0回答:1

我在 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 amazon-s3 firefox cors cloudflare
1个回答
0
投票

好吧,看来问题毕竟出在 nginx 端。通过将

add_header Content-Type application/zip;
添加到我的位置块,修复了 Firefox 预检请求的问题。我以为我已经通过在
application/zip
块中包含
types {}
来解决这个问题,但显然情况并非如此。

现在我的 zip 文件正在下载,而不是执行

range
请求我的 js/ajax 代码,但这完全是另一个问题。

© www.soinside.com 2019 - 2024. All rights reserved.