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

如何配置Rack::Static处理带指纹静态资源以实现缓存击穿

解决Rack应用中静态资源指纹路径的匹配问题

Rack::Static本身不支持自动匹配带指纹的资源路径到实际文件,所以需要通过自定义中间件来重写请求路径,把带指纹的URL转换为服务器上实际存在的文件路径。以下是具体实现方案:

一、自定义路径重写中间件

编写一个中间件,拦截请求并修改PATH_INFO,移除URL中的指纹部分,再传递给Rack::Static处理。

中间件代码示例

class AssetFingerprintRewriter
  def initialize(app)
    @app = app
  end

  def call(env)
    # 匹配格式如 /css/application.min.v1.2.3.css 的路径
    # 将其重写为 /css/application.min.css
    env['PATH_INFO'] = env['PATH_INFO'].gsub(
      %r{/(.+)\.[\w\d.-]+\.([a-z]{2,4})$}, 
      '/\1.\2'
    )
    @app.call(env)
  end
end
  • 正则说明:匹配URL中文件名部分的<指纹>(由字母、数字、点、横杠组成),将其移除,保留原文件名和扩展名。
  • 如果你的指纹格式是用横杠分隔(如application.min-d41d8cd9.css),可以把正则改成%r{/(.+)-[\w\d]+\.([a-z]{2,4})$}。

二、集成到Rack应用栈

在config.ru中,把自定义中间件放在Rack::Static之前,确保路径先被重写再交给静态资源中间件处理:

# 先加载自定义中间件
use AssetFingerprintRewriter

# 配置Rack::Static
use Rack::Static,
  urls: ['/css', '/js'], # 指定需要托管的静态资源目录
  root: 'public',        # 静态资源根目录
  header_rules: [
    # 设置强缓存头,配合指纹策略实现永久缓存
    [:all, {'Cache-Control' => 'public, max-age=31536000, immutable'}]
  ]

# 启动你的Rack应用
run YourRackApplication.new

三、其他标准解决方案

如果项目复杂度较高,可以考虑使用Sprockets——Ruby生态中专门处理资产打包、指纹化的工具。它不仅能自动生成带指纹的资源文件,还内置了路由处理逻辑,无需手动写中间件。但如果只是简单的路径重写需求,自定义中间件是更轻量的选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:55:16