我的 cloudflare workers 站点包含一个 React 应用程序获取的二进制数据。此二进制数据存储为 gzip 压缩,因为它压缩得非常好(我们谈论的是 20-25 倍的缩减,而未压缩它太大而无法适应 10MB KV 的限制)。我遇到的问题是工作人员返回的数据没有适当的标头:
Content-Encoding: gzip
或者如果我让工作人员添加标头,cloudflare 将加倍压缩响应。那么如何在 cloudflare KV 中存储 gzip 压缩数据,以便我可以使用正确的内容编码返回它,而无需 cloudflare 双重压缩响应?
参考
对于最小的复制:这是我正在使用的两个工作脚本。
import { getAssetFromKV, mapRequestToAsset } from '@cloudflare/kv-asset-handler'
addEventListener('fetch', event => {
try {
event.respondWith(handleEvent(event))
} catch (e) {
event.respondWith(new Response('Internal Error', { status: 500 }))
}
})
async function handleEvent(event) {
const cacheControl = { browserTTL: 60 * 60 * 6 };
return await getAssetFromKV(event, { mapRequestToAsset, cacheControl });
}
上述工作脚本返回的二进制数据没有内容编码头,因此浏览器不会自动膨胀响应。
所以然后我尝试通过手动添加标题
import { getAssetFromKV, mapRequestToAsset } from '@cloudflare/kv-asset-handler'
addEventListener('fetch', event => {
try {
event.respondWith(handleEvent(event))
} catch (e) {
event.respondWith(new Response('Internal Error', { status: 500 }))
}
})
async function handleEvent(event) {
const cacheControl = { browserTTL: 60 * 60 * 6 };
const resp = await getAssetFromKV(event, { mapRequestToAsset, cacheControl });
resp.headers.set("Content-Encoding", "gzip");
return resp;
}
响应具有正确的内容编码,但 cloudflare 会压缩响应,因此现在它在 gzip 中提供 gzip。
有没有什么办法可以让我在 cloudflare KV 中使用正确的标头提供压缩数据而不双重压缩响应?