2016-08-22 80 views
0

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

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

在我的路线我想补充

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”,但也许这是不必要的步骤。

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

回答

0

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

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

如果用户请求过期指纹的css或js文件,他们可能有一个已过时的html文档,您可能希望他重新加载他所拥有的内容:“有新版本,请重新加载现场”。因为链轮店

部署在Heroku的照顾最多3个版本的资产,你https://devcenter.heroku.com/articles/rails-4-asset-pipeline#only-generate-digest-assets

+0

感谢@phoet。我认为这是不对的!您会如何处理这些请求?我猜想问题的一部分是我有一个获取“:username /:post_name”的路由,这样一个无法识别的资产将以:“username”和“post_name”命名为“application- [指纹] .js“,这会导致.js的InvalidCrossOriginRequest错误或.css的UnknownFormat错误。 – Sujimichi