ActiveStorage搭配CDN时,ENV['CDN_HOST']应如何配置?
解决ActiveStorage CDN URL配置问题
首先明确:不需要把Rails应用部署到CDN域名下,CDN域名的URL生成是正确的,核心是要让CDN回源到你的DigitalOcean Spaces存储桶,而非Rails应用。
正确的配置步骤
修正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自定义域名确保生产环境启用该存储服务
在config/environments/production.rb中设置:config.active_storage.service = :spaces使用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
相关产品推荐
相关产品推荐

