我有一个在Heroku上运行的rails(4.1)应用程序,其中cloudflare作为CDN。在来自NewRelic的错误日志中,我看到了对于过期的css和js资产的请求,主要是application-<fingerprint>.js
和application-<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”,但也许这是不必要的步骤。
所以我的问题是,会这样做是不好的做法?有没有更好的方法来处理过期资产的请求?
感谢@phoet。我认为这是不对的!您会如何处理这些请求?我猜想问题的一部分是我有一个获取“:username /:post_name”的路由,这样一个无法识别的资产将以:“username”和“post_name”命名为“application- [指纹] .js“,这会导致.js的InvalidCrossOriginRequest错误或.css的UnknownFormat错误。 – Sujimichi