如何将子域名指向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证书);
- 后端服务选择Cloud Storage,指定
- 修改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




