Ruby on rails 3 如何为web爬虫禁用Rails会话?
过去,应用程序控制器中的类似行会完全禁用请求的会话:Ruby on rails 3 如何为web爬虫禁用Rails会话?,ruby-on-rails-3,session,web-crawler,Ruby On Rails 3,Session,Web Crawler,过去,应用程序控制器中的类似行会完全禁用请求的会话: session :off, :if => Proc.new {|req| req.user_agent =~ BOT_REGEX} 在Rails3.x中,这可能已被弃用,也可能不再有效。我意识到新的概念是会话是延迟加载的,但是通过应用程序的执行流使用/检查会话,即使它是一个web机器人 那么,是否有一些新的机制可以用于在每个请求的基础上禁用会话?在Rails 3中似乎没有内置的方法来实现这一点,但您可以使用monkey patchSe
session :off, :if => Proc.new {|req| req.user_agent =~ BOT_REGEX}
在Rails3.x中,这可能已被弃用,也可能不再有效。我意识到新的概念是会话是延迟加载的,但是通过应用程序的执行流使用/检查会话,即使它是一个web机器人
那么,是否有一些新的机制可以用于在每个请求的基础上禁用会话?在Rails 3中似乎没有内置的方法来实现这一点,但您可以使用monkey patch
SessionHash
来获得类似的结果:
class ActionDispatch::Session::AbstractStore::SessionHash
private
def load_for_write!
load! unless loaded? || (@env['HTTP_USER_AGENT'] =~ BOT_REGEX)
end
end
这将阻止创建会话存储对象。您仍然可以分配到
会话
散列,甚至可以稍后在同一请求中访问相同的会话数据 我假设@jordoh的答案适用于默认的rails cookie_存储,但不适用于使用active_record_存储在数据库中存储会话的我
如果您使用的是active_record_store,并且希望停止为机器人程序创建的会话,则此操作有效:
# Save this file as config/initializers/session_store_ext.rb
# and don't forget to define BOT_REGEX
class ActiveRecord::SessionStore
_set_session = instance_method :set_session
define_method :set_session do | env, sid, session_data, options |
unless env['HTTP_USER_AGENT'] =~ BOT_REGEX
_set_session.bind(self).call env, sid, session_data, options
end
sid
end
private :set_session
end
我写了一篇博客文章详细介绍了这一点-嗯-这真的很有趣。你怎么知道的?也就是说,我如何为自己验证这一点?我猜SessionHash.load_的源代码是用来写的!方法?您可以通过将您的用户代理设置为将被检测为bot的内容(例如),删除您可能拥有的任何现有会话cookie,并浏览您的站点来手动测试。每个action Rails日志都应该有一行“No session found”-或者如果您使用的是ActiveRecord SessionStore,您可以查看会话表,并验证是否没有新的会话记录添加到数据库中。谢谢,但我想知道的是,您是如何想出这个解决方案的?你怎么知道你可以做这种代码替换?最后,在Rails启动序列中,放置代码的最佳位置是哪里?我检查了
SessionHash
的源代码,了解了它的基本功能,然后在load中放置了一个断点
并发出一些请求以了解典型的调用路径。在验证Rails的惰性会话创建确实依赖于load\u进行写入之后
为了创建会话,我通过替换load\u for\u write代码>的实现从未调用过加载代码>(除非已加载,否则用于写入!
的load\u的原始正文为load!
)。我发布的代码只是为了更改行为。您可以将此代码添加到路径为config/initializers/action\u dispatch\u mods.rb
的文件中,它将在Rails启动过程中自动应用。