阻止机器人程序访问rails active_storage图像



我的网站有大量的图表,当有新数据可用时,这些图表每天都会重新计算。这些图使用active_storage存储在AmazonS3上。就是一个典型的例子

# app/models/graph.rb
class Graph < ApplicationRecord
has_one_attached :plot
end

并且在视图中

<%= image_tag graphs.latest.plot %>

其中CCD_ 2检索最新的图。每天都会创建一个新的图形和附加的绘图,并删除旧的图形/绘图。

包括谷歌和Yandex在内的许多机器人正在对图形进行索引,但当机器人返回并再次访问等URL时,会产生异常

www.myapp.com/rails/active_storage/representations/somelonghash

是否有一种方法可以为绘图生成一个持久链接,该链接在删除图形/绘图然后重新计算时不会过期。如果做不到这一点,有没有办法阻止机器人访问这些阴谋。

请注意,我目前在routes.rb文件的末尾有一个catchall:

get '*all', to: 'application#route_not_found', constraints: lambda { |req|
req.path.exclude? 'rails/active_storage'
} if Rails.env.production?

在catchall中排除活动存储就是为了应对这个问题。删除active_storage豁免是很诱人的,但这可能会停止正确的active_storageroute。

也许我可以在rack_rewrite.rb中放入一些东西来解决这个问题?

有趣的问题。

一个简单的解决方案是使用send_data功能直接发送图像。然而,这也可能有其自身的问题,主要是在可能增加服务器带宽使用(和降低服务器性能(方面。然而,如果你不想在创建重定向模型和相关逻辑方面遇到以下问题,那么你就需要这样的解决方案。


原始应答

重定向将需要设置某种Redirects::Graph模型。这基本上可以验证一个图是否被删除,并重定向到新的图,而不是请求的图。它将有两个字段,一个old_signed_id(biglonghash(和一个new_signed_id

每次删除

我们需要填充重定向模型,并在每次创建新图时添加一个新条目(我们应该能够以某种方式从blob生成signed_id(。

为了提高性能,并避免在一行中进行大量重定向,这可能会导致不同的错误/问题。您必须管理请求更改。IE:假设你现在有一个重定向A => B,你删除B,用C替换它,现在你需要一个A => CB => C(以避免A => B => C重定向(,这个链可能会变得相当长。只要添加新的signed_id => new_id索引并执行Redirects::Graph.where(new_signed_id: old_signed_id).update_all(new_signed_id: new_signed_id)来更新所有相关的旧重定向,就可以有效地处理这一问题,无论何时重新生成图。

控制器本身更棘手,我能想到的最干净的方法是对ActiveStorage::RepresentationsController进行猴子补丁,添加一个类似于这样的graphs.latest0(可能无法正常工作,params[:signed_id]和表示路径可能不正确(:

before_action :redirect_if_needed
def redirect_if_needed
redirect_model = Redirects::Graph.find_by(old_signed_id: params[:signed_id])
redirect_to rails_activestorage_representations_path(
signed_id: redirect_model.new_signed_id
) if redirect_model.present?
end

如果你有数据库的版本控制设置(IE:Papertrail gem或其他什么(,你可能可以通过一些工作来计算old_signed_idnew_signed_id,并为当前导致错误的URL构建重定向。否则,遗憾的是,这种方法只会防止未来的错误,并且可能不可能使当前损坏的url正常工作。

理想情况下,尽管您会更新blob本身以使用新图形而不是旧图形,而不是删除,但不确定这是否可行/实用。

你试过了吗?

在文件/robots.txt中放入:

User-agent: *
Disallow: /rails/active_storage*

最新更新