ruby – Sinatra会员“消失”

我已经成功地解决了会话成员无法使用的问题,即使它们已经设置并且想知道它为什么会发生.我的情况可以描述为:

> Sinatra app使用:session.
>使用oAuth授权用户并在此过程中设置:ret_url会话成员,以便应用程序知道在auth之后返回的位置.
>服务器是Cedar堆栈上的独角兽(Heroku)

这在本地运行时非常有效,但是:ret_url会话成员在Heroku会话中完全消失了.我发现如果我删除了这段代码,它修复了问题:

  before do
    cache_control :public, :must_revalidate, :max_age => 60
  end

问题1:我猜测我的cookie被缓存而没有:ret_url值,这就是它破坏的原因?

问题2:我正在设置会话成员,如下面的路由条件代码所示,这是错误的地方吗?

  # redirect users to login if necessary
  set(:auth) do |access_token|      
    condition do

      if request.request_method == 'GET'
        session[:ret_url] = request.path_info 
      end

      redirect '/' unless user_logged_in?
    end
  end

我想使用缓存,但我的cookie仍然有效.

最佳答案 在不知道所有细节的情况下很难看到发生了什么,但是有一个简单的规则,你很可能违反:不要在应该做某事的动作上使用http缓存(除了显示页面).启用http缓存后,您的浏览器甚至不会尝试重新加载页面并从浏览器缓存中呈现它.

Cookie不会缓存在任何地方,cache_control唯一做的就是设置CacheControl http响应值

在您的情况下,您可以做的最好的事情是添加没有操作页面的路由列表到您之前的块:

before '/my/static/page' do
  cache_control :public, :must_revalidate, :max_age => 60
end

最有可能的是,您将拥有非常有限的路由集,您可以从http缓存中受益

点赞