You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让GCS存储的资源仅被网站页面调用而无法直接访问?

如何实现GCS资源仅允许页面引用、禁止直接访问?

你的需求完全可以实现!核心是通过请求Referer头校验来区分“页面引用”和“直接访问”的场景,我来给你拆解两种靠谱的方案,同时帮你分析之前配置失败的可能原因:

方案一:单存储桶内通过IAM条件精准控制权限

你之前尝试的单资源权限配置思路是对的,问题大概率出在条件规则的写法上。具体操作步骤:

  1. 保留index.html的公开访问权限:给allUsers分配storage.objects.get权限,确保用户能正常打开页面。
  2. 针对图片、CSS等资源,移除所有公开权限,然后添加一条自定义IAM规则:
    • 主体选择allUsers(因为需要允许浏览器从你的网站发起请求)
    • 权限选择storage.objects.get
    • 添加条件:request.referer.matches('^https?://www.website.com/.*$')
      这条规则会检查请求的Referer头是否来自你的网站域名——当页面引用资源时,浏览器会自动带上当前页面的URL作为Referer,而直接访问资源URL时,Referer头为空或不匹配,从而实现限制。

小提示:正则表达式要覆盖http/https协议,以及域名后的任意路径,避免因为Referer带路径导致匹配失败。

方案二:双存储桶+Cloud CDN强化限制

如果想把页面和资源彻底分离,双存储桶的思路也可行,但需要结合Cloud CDN来提升限制的可靠性:

  • 将静态资源(图片、CSS)放到独立的存储桶,关闭该桶的所有公开访问权限。
  • 为这个资源桶配置Cloud CDN,源站指向该GCS桶。
  • 在Cloud CDN的缓存规则中添加Referer限制:仅允许来自www.website.com的请求访问CDN资源。
  • 在你的index.html中,引用资源时使用Cloud CDN的域名,而非GCS存储桶的原始域名。

这种方法不仅能实现访问限制,还能通过CDN缓存提升资源加载速度,同时CDN层的拦截比纯GCS权限更高效。

你之前配置失败的可能原因

  1. Referer规则不严谨:比如你只写了www.website.com,但浏览器发送的Referer通常是带协议(http/https)和完整路径的URL,导致规则匹配失败。
  2. 权限冲突:如果同时给资源设置了公开权限和限制条件,公开权限会优先生效,导致限制规则不起作用。
  3. 忽略协议差异:如果你的网站同时支持http和https,规则要同时覆盖两种协议的Referer。

补充说明

  • 虽然Referer头存在被伪造的可能,但对于普通用户的直接访问限制已经足够,这也是目前GCS生态下最贴合你需求的方案。
  • 正如你提到的,GCS确实不支持.htaccess,所有配置都需要通过GCS控制台、gcloud命令行或API完成。

内容的提问来源于stack exchange,提问作者Nezih Savaşkan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:40:29