在尝试对 R2 中托管的对象(相当于 Cloudflare S3)发出
fetch
请求时,我遇到了非常奇怪的 COR 问题组合:
那么,我就没有 COR 问题了。
同样,如果我禁用缓存然后重新启用它,我也没有问题。但是...如果我“清除浏览器缓存”,然后刷新页面,我会遇到 COR 问题。
尝试使用以下 COR 策略对 R2 存储桶发出
fetch
请求时会发生这种情况:
[
{
"AllowedOrigins": [
"https://localhost:3000",
"http://localhost:3000"
],
"AllowedMethods": [
"GET",
"HEAD",
"POST",
"PUT",
"DELETE"
],
"AllowedHeaders": [
"*"
],
"ExposeHeaders": [
"*"
],
"MaxAgeSeconds": 3600
}
]
这应该允许所有 COR 请求。可能会发生什么?
需要注意的一件事 - 如果请求包含
Origin
标头,Cloudflare 仅返回正确的 COR 标头。
这是我用来测试 CORS 与非 CORs 版本的脚本:
#!/bin/bash
# config
url="$1"
origin="${2:-http://localhost:3000}"
if [ -z "$url" ]; then
echo "usage: $0 <url> [origin]"
echo "example: $0 https://your-r2-url.com/file http://localhost:3000"
exit 1
fi
echo "testing cors for url: $url"
echo "using origin: $origin"
echo
# test 1: fresh request
echo "=== testing fresh request ==="
curl -si -h "origin: $origin" \
-h "cache-control: no-cache" \
"$url" | grep -v "^$"
# get response headers and extract etag
etag=$(curl -si -h "origin: $origin" "$url" | grep -i "etag" | tr -d '\r' | cut -d' ' -f2)
if [ ! -z "$etag" ]; then
echo
echo "=== testing cached request with etag: $etag ==="
curl -si -h "origin: $origin" \
-h "if-none-match: $etag" \
"$url" | grep -v "^$"
fi
在这两种情况下我都得到了
Access-Control-Allow-Origin
标题。
我解决了这个问题:
const response = await fetch(url, {
cache: 'no-cache'
});
说实话,我不确定发生了什么。我的假设是,由于
no-cache
仍然向服务器发出条件请求,它正在刷新一些重要的标头?