CORS header 存在于 PUT 请求中,但不存在于 OPTIONS 请求中

The CORS header is present on PUT requests but not on OPTIONS requests

我有一个具有以下 CORS 配置的 Google Cloud Storage 存储桶:

[
    {
      "origin": ["http://localhost:8080"],
      "responseHeader": [
        "Content-Type",
        "Access-Control-Allow-Origin",
        "Origin"],
      "method": ["GET", "HEAD", "DELETE", "POST", "PUT", "OPTIONS"],
      "maxAgeSeconds": 3600
    }
]

我正在使用以下代码生成签名的 URL:

let bucket = storage.bucket(bucketName);
let file = bucket.file(key);

const options = {
    version: "v4",
    action: "write",
    expires: Date.now() + 15 * 60 * 1000, // 15 minutes
    contentType: "application/zip"
};

let url = await file.getSignedUrl(options))[0];

对于我的请求,我使用以下 headers:

Origin: http://localhost:8080
Content-Type: application/zip

当我尝试使用 PUT 请求上传数据时,一切正常,我得到了包含我的 Origin 的 Access-Control-Allow-Origin header。但是,当我使用完全相同的 header 执行 OPTIONS 请求时,它无法 return Access-Control-Allow-Origin header。我已尝试对我的 CORS 配置进行许多更改,但 none 的效果如下:

请注意,如 public documentation 所述,您不应在 CORS 配置中指定 OPTIONS 并注意云存储仅支持 DELETE, GET, HEAD, POST, PUT XML API DELETE, GET, HEAD, PATCH, POST, PUT JSON API。因此,我相信您在使用 OPTIONS 方法时遇到的情况应该是预期的行为。

我在同事的帮助下解决了自己的问题,当我在 Postman 中测试功能时,CORS header 没有作为对 OPTIONS 请求的响应发送,因为请求是缺少 Access-Control-Request-Method header。当我添加这个 header 它工作正常。