【发布时间】:2016-08-22 13:43:56
【问题描述】:
我有一个在 Heroku 上运行的 rails (4.1) 应用程序,使用 cloudflare 作为 CDN。在 NewRelic 的错误日志中,我看到不断有对过期 css 和 js 资产的请求,主要是 application-<fingerprint>.js 和 application-<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”,但这可能是不必要的步骤。
所以我的问题是;这样做会是不好的做法吗?有没有更好的方法来处理过期资产的请求?
【问题讨论】:
标签: ruby-on-rails-4 asset-pipeline csrf