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

ActiveStorage搭配CDN时,ENV['CDN_HOST']应如何配置?

解决ActiveStorage CDN URL配置问题

首先明确:不需要把Rails应用部署到CDN域名下,CDN域名的URL生成是正确的,核心是要让CDN回源到你的DigitalOcean Spaces存储桶,而非Rails应用。

正确的配置步骤

  1. 修正ActiveStorage存储服务配置
    在config/storage.yml中,针对Spaces的配置添加cdn_host字段,指定你的CDN自定义域名:

    spaces:
      service: S3
      access_key_id: <%= ENV['DO_SPACES_ACCESS_KEY'] %>
      secret_access_key: <%= ENV['DO_SPACES_SECRET_KEY'] %>
      region: nyc3 # 替换为你的Spaces所在区域
      bucket: your-bucket-name # 替换为你的存储桶名称
      endpoint: https://nyc3.digitaloceanspaces.com # 替换为对应区域的官方endpoint
      cdn_host: https://cdn.my-website.com # 填写你的CDN自定义域名
    
  2. 确保生产环境启用该存储服务
    在config/environments/production.rb中设置:

    config.active_storage.service = :spaces
    
  3. 使用ActiveStorage原生方法生成CDN URL
    无需自定义cdn_image路由,直接调用ActiveStorage的url方法就能自动生成CDN域名的资源链接:

    user.profile_image.url
    

    此时生成的URL会自动套用你配置的cdn_host,格式为https://cdn.my-website.com/...

为什么自定义路由会出问题

你之前配置的cdn_image路由是让Rails来处理图片请求,但CDN域名下没有部署Rails应用,自然无法响应这类请求。而CDN的正确使用逻辑是:直接与Spaces存储桶对接,用户请求CDN URL时,CDN会从Spaces拉取资源并缓存,后续请求直接返回缓存内容,完全不需要经过Rails应用,这种方式更高效,也符合CDN的设计初衷。

如果你的图片需要权限控制(比如仅登录用户可访问),才需要通过Rails路由代理,此时你需要调整CDN的回源地址为Rails应用的原主机,同时配置CDN不缓存带权限验证的请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:32:39