【问题标题】:Rails 3.1 asset pipeline: how to deal with requests to expired assets?Rails 3.1 资产管道:如何处理对过期资产的请求?
【发布时间】:2011-11-12 17:20:51
【问题描述】:

一旦您使用资产管道设置了一个应用程序,它可能会为您生成一个带有如下 URL 的图像(签名被截断):

http://mysite.com/assets/logo-1b2b3c.png

然后,当您更改资产或更新全局资产版本时,您最终会得到这样的结果:

http://mysite.com/assets/logo-2b3c1a.png

现在,有些人仍会向旧资产发送请求。在我理解的默认 Rails 3.1 部署下,这些只是 404。这似乎不太友好。对新资产执行 301 或直接交付新资产会更好。

是否有一些内置方法可以做到这一点,还是我必须实现自己的资产缺失功能?

【问题讨论】:

  • 没有人应该发送对旧资产的请求。如果他们正在查看缓存的 HTML,他们应该使用缓存的资产。
  • 我同意@meagar。我很好奇会发生这种情况的情况。你能说明这是怎么发生的吗?
  • @Andrew Vit:虽然我同意这不应该发生,但它可以。当这种情况发生时,我遇到的情况是,如果有人对包含哈希的图像进行热链接,需要支持的热链接。当然,最好是预期人们会进行热链接并提供未版本化的资产路径,但是当时我们无法返回通知 500 个外部站点来更改其链接,因此在生产世界的现实中,我们不得不做这样的事情。
  • @steven 人们不应该热链接您的资源。这就是不是你的问题的定义。

标签: ruby-on-rails asset-pipeline


【解决方案1】:

我自己实现的:

Myapp::Application.routes.draw do
  match 'assets/:id.:format' => 'assets#show'
end

class AssetsController < ApplicationController
  def show
    asset_without_digest = "#{params[:id].gsub /-[0-9a-f]{32}$/, ''}.#{params[:format]}"
    new_path = ActionView::Base.new.image_path(asset_without_digest)
    if url_for(params).include? new_path
      head 404
    else
      redirect_to new_path, :status => 301
    end
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多