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

S3+CloudFront环境下内部链接访问被拒但直接URL可正常访问

解决S3+CloudFront静态网站跳转子页面403的问题

嘿,我刚碰到过几乎一模一样的问题,咱们一步步来排查解决:

最可能的原因:存储桶策略的Referer限制不完整

你提到已经配置了存储桶策略允许来自HTTP裸域名的访问,但别忘了现在你的网站是HTTPS的——当用户从HTTPS主页点击跳转链接时,请求的Referer头是https://你的域名/,而如果你的策略只允许HTTP的Referer,S3就会直接拒绝这个请求。但直接在地址栏输入子页面URL时,浏览器通常不会发送Referer头(或者是空),所以策略的限制没触发,就能正常访问。

修正存储桶策略

把策略里的Referer条件改成同时包含HTTP和HTTPS,并且用StringLike来匹配所有子路径:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::你的存储桶名称/*",
      "Condition": {
        "StringLike": {
          "aws:Referer": [
            "http://你的域名/*",
            "https://你的域名/*"
          ]
        }
      }
    }
  ]
}

如果你的策略还用到了CloudFront的Origin Access Identity(OAI),记得要同时保留允许OAI访问的规则,所有通过CloudFront的请求都是以OAI身份访问S3的,这俩条件是互补的。

第二个排查点:CloudFront源配置是否用了S3静态网站端点

如果你把CloudFront的源直接设成了S3的REST端点(比如你的存储桶.s3.amazonaws.com),而不是静态网站托管的端点(比如你的存储桶.s3-website-区域.amazonaws.com),就会出现路径匹配问题:

  • 静态网站端点会自动把/docs/这类路径映射到/docs/index.html
  • REST端点则要求必须明确指定对象路径,访问/docs/会返回403

修正CloudFront源配置

  1. 打开CloudFront控制台,找到你的分发,进入“源”标签页
  2. 编辑现有的源,把“源域名”改成S3静态网站的端点(可以在S3控制台的“静态网站托管”页面找到)
  3. 源类型选择“自定义源”,端口设置为80
  4. 保存修改,等待CloudFront分发更新(通常需要10-15分钟)

最后检查:主页跳转链接的路径格式

确保主页里的子页面链接是相对路径(比如<a href="/docs/">Docs</a>)或者完整的HTTPS路径,避免出现HTTP的硬编码链接——虽然浏览器会自动升级,但偶尔会导致奇怪的请求头问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:06:35