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

如何在Rails ActiveStorage中用自定义域名隐藏S3 Bucket URL

解决Rails ActiveStorage自定义S3域名跳转及AccessDenied问题

1. 配置Rails让ActiveStorage跳转至media.example.com

修改Rails存储配置,指定自定义域名作为S3服务的访问入口:

  1. 打开 config/storage.yml,在S3服务配置块中添加url和path_style参数:
s3:
  service: S3
  access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
  secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
  bucket: <%= ENV['S3_BUCKET_NAME'] %>
  region: eu-west-2
  url: "https://media.example.com"
  path_style: false
  1. 确保环境配置文件(如config/environments/production.rb)启用该存储服务:
config.active_storage.service = :s3

重启Rails应用后,ActiveStorage生成的Blob重定向链接会自动指向media.example.com。

2. 配置S3接受media.example.com域名访问(解决AccessDenied)

完成以下两项配置,让S3认可自定义域名的请求:

步骤1:更新Bucket的CORS配置

在AWS S3控制台进入目标Bucket的「权限」标签,找到「跨域资源共享(CORS)」,添加以下配置:

[
  {
    "AllowedHeaders": ["*"],
    "AllowedMethods": ["GET", "HEAD"],
    "AllowedOrigins": ["https://media.example.com"],
    "ExposeHeaders": []
  }
]

步骤2:修改Bucket访问策略

在「权限」标签的「Bucket策略」中,添加允许media.example.com作为Host头的访问规则(替换YOUR_BUCKET_NAME为实际Bucket名称):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": ["s3:GetObject"],
      "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*",
      "Condition": {
        "StringEquals": {
          "aws:Host": "media.example.com"
        }
      }
    }
  ]
}

额外检查项

  • 确认DNS的CNAME记录已正确设置:media.example.com指向YOUR_BUCKET_NAME.s3.eu-west-2.amazonaws.com
  • 验证Rails生成的预签名URL中Host头为media.example.com(对应第一步的配置)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:42:49