rails从过期资产重定向

时间:2016-08-22 13:43:56

标签: ruby-on-rails-4 asset-pipeline csrf

我有一个在Heroku上运行的rails(4.1)应用程序,cloudflare作为CDN。在NewRelic的错误日志中,我看到对过期的css和js资产的请求不断涓涓细流,主要是application-<fingerprint>.jsapplication-<fingerprint>.css(指纹已经过期)。

我想知道将这些请求重定向到当前资产的解决方案,但我不确定这是否是一个好/安全的事情。

在我的路线中,我会添加

get "assets/:asset_name" => "assets#show"

然后添加一个assets_controller.rb:

class AssetsController < ApplicationController
  skip_before_action :authenticate_user!
  skip_before_action :verify_authenticity_token, :only => [:show]

  def show    
    begin
      asset_name = params[:asset_name].gsub(/-[0-9a-f]{32}$/, "") << ".#{params[:format]}"

      if ["css", "js"].include?(params[:format])
        redirect_to "/assets/" + Rails.application.assets.find_asset(asset_name).digest_path
      else
        return asset_not_found!
      end

    rescue
      return asset_not_found!
    end
  end

  private

  def asset_not_found!
    render :text => "asset #{params[:asset_name]}.#{params[:format]} not found", :status => 404
  end

end

我在舞台环境中试过这个并且它有效但我不确定这是否是正确的方法。
特别需要让skip_before_action :verify_authenticity_token困扰我,但如果没有它请求.js资产会导致InvalidCrossOriginRequest错误。

我只看到过期css和js资产的请求,而不是任何图像资产,因此上面检查请求格式是“css”还是“js”,但这可能是不必要的步骤。

所以我的问题是;会这样做是不好的做法?有没有更好的方法来处理过期资产的请求?

1 个答案:

答案 0 :(得分:0)

我认为这是一种不好的做法。

并不特别指出你实现id的方式(尽管我认为有更好的方法使用机架中间件),但更多的是因为你不应该将这些过期的资产重定向到任何地方。

如果用户请求带有陈旧指纹的css或js文件,他们可能会有一个过时的html文档,您可能希望他重新加载他拥有的内容:&#34;有新版本,请重新加载您的网站&#34;。

部署在heroku处理,因为链轮为您存储最多3个版本的资产https://devcenter.heroku.com/articles/rails-4-asset-pipeline#only-generate-digest-assets