You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何将子域名指向Google Cloud Storage存储桶(不可改桶名)

解决GCS自定义子域名访问问题(无需修改桶名)

问题原因

直接添加CNAME记录无效的核心原因是:Google Cloud Storage要求自定义域名必须与桶名完全一致。你的桶名为my-bucket,而自定义域名是storage.example.com,两者不匹配。当你通过storage.example.com访问时,GCS会将storage.example.com当作桶名去查找,自然返回NoSuchBucket错误。

可行解决方案(无需修改现有桶)

方案1:使用Google Cloud负载均衡器

适合已使用GCP生态的场景:

  • 创建HTTP(S)负载均衡器:
    • 后端服务选择Cloud Storage,指定my-bucket作为目标存储桶;
    • 前端配置添加自定义域名storage.example.com,并配置SSL证书(可使用GCP免费的托管SSL证书);
  • 修改DNS记录:将storage.example.com的CNAME指向负载均衡器的前端域名(如xxx.lb.googleapis.com);
  • 访问时,负载均衡器会自动将请求转发到正确的桶,同时向GCS传递正确的桶标识。

方案2:使用Nginx反向代理

适合自行管理服务器的场景:

  • 部署Nginx服务器,添加以下配置(替换证书路径为实际路径):
server {
    listen 80;
    server_name storage.example.com;
    return 301 https://$server_name$request_uri; # 强制HTTPS(可选)
}

server {
    listen 443 ssl;
    server_name storage.example.com;

    ssl_certificate /path/to/your/cert.crt;
    ssl_certificate_key /path/to/your/private.key;

    location / {
        proxy_pass https://my-bucket.storage.googleapis.com;
        proxy_set_header Host my-bucket.storage.googleapis.com; # 关键:替换Host头为桶的域名
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
  • 修改DNS记录:将storage.example.com的A记录指向Nginx服务器的公网IP;
  • 用户访问自定义域名时,Nginx会转发请求到GCS,并传递正确的桶名Host头,避免错误。

方案3:使用Cloudflare转发/Workers

适合使用Cloudflare做DNS管理的场景:

方式A:Page Rules转发

  • 在Cloudflare中添加域名example.com并切换DNS服务器;
  • 创建Page Rule,匹配storage.example.com/*,设置为Forward URL(状态码200 - Rewrite),目标URL填写https://my-bucket.storage.googleapis.com/$1
  • 此方式会在保持URL不变的前提下,将请求转发到GCS桶。

方式B:Cloudflare Workers(更灵活)

  • 创建Workers脚本,处理请求转发:
addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const url = new URL(request.url)
  const gcsTarget = `https://my-bucket.storage.googleapis.com${url.pathname}${url.search}`
  const newRequest = new Request(gcsTarget, {
    method: request.method,
    headers: new Headers(request.headers),
    body: request.body,
    redirect: 'follow'
  })
  newRequest.headers.set('Host', 'my-bucket.storage.googleapis.com')
  return await fetch(newRequest)
}
  • 将Workers绑定到storage.example.com域名;
  • 此方式可处理更复杂的请求场景,同时保持自定义域名显示。

内容的提问来源于stack exchange,提问作者Ahmer Saud

火山引擎 最新活动