【问题标题】:rails redirecting from expired assets从过期资产重定向的rails
【发布时间】:2016-08-22 13:43:56
【问题描述】:

我有一个在 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”,但这可能是不必要的步骤。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    如果用户请求一个带有过期指纹的 css 或 js 文件,他们可能有一个过期的 html 文档,您可能希望他重新加载他的文件:“有一个新版本,请重新加载您的网站”。

    部署由 heroku 负责,因为 sprockets 为您存储多达 3 个版本的资产 https://devcenter.heroku.com/articles/rails-4-asset-pipeline#only-generate-digest-assets

    【讨论】:

    • 谢谢@phoet。我以为这是不对的!您建议如何处理这些请求?我想问题的一部分是我有一条获取“:用户名/:post_name”的路线,因此无法识别的资产命中的路线是:用户名作为“资产”,:post_name”类似于“应用程序- [fingerprint].js" 导致 .js 的 InvalidCrossOriginRequest 错误或 .css 的 UnknownFormat 错误。
    猜你喜欢
    • 2012-03-15
    • 2011-11-12
    • 2013-10-29
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 2015-02-27
    相关资源
    最近更新 更多