4

セッション メンバーが設定されているのに使用できないという問題のトラブルシューティングに成功しました。その理由を知りたいです。私の状況は次のように説明できます。

  1. を使用したシナトラアプリ:session
  2. oAuth を使用してユーザーを承認し、その過程で:ret_urlセッション メンバーを設定して、アプリが認証後に戻る場所を認識できるようにします。
  3. サーバーは 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 を有効にしたままにします。

4

2 に答える 2

1

すべての詳細を知らずに何が起こっているのかを理解するのは難しいですが、おそらく違反している可能性が高いという単純なルールがあります: 何かを行うことになっているアクション (単にページを表示する以外) で http キャッシュを使用しないでください。http キャッシュがオンの場合、ブラウザはページを再読み込みしようとせず、ブラウザ キャッシュからレンダリングします。

Cookie はどこにもキャッシュされません。cache_control が行う唯一のことは、CacheControl http 応答値を設定することです。

あなたの場合、あなたができる最善のことは、アクションのないページを持つルートのリストを before ブロックに追加することです:

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

ほとんどの場合、http キャッシュの恩恵を受けることができるルートのセットは非常に限られています。

于 2012-09-22T17:28:36.180 に答える
1

ここのメンバーではありませんが、この回答の功績に値するアリ・ブラウンという名前チャップ(アリに手を振る)は、正しい解決策を指摘してくれました。あたりenable :sessionsuse Rack::Session::Cookie

use Rack::Session::Cookie, :key => 'rack.session',
                           :domain => 'foo.com',
                           :path => '/',
                           :expire_after => 2592000, # In seconds
                           :secret => 'change_me'

これを自分に追加しましたがconfig.ru、すべて問題ありません。

また、この投稿で、環境変数を介してこれを行うための代替提案set :session_secret, 'change_me'、つまり次のことにも気付きました。

$ heroku config:add SESSION_KEY=a_longish_secret_key

次に、アプリで

enable :sessions
set :session_secret, ENV['SESSION_KEY'] || 'change_me'

明らかに、このRack::Session::Cookieアプローチでも環境変数戦略を使用できます。構成の柔軟性が向上するため、それが私が行った方法です。

これらが機能する理由は、キャッシュ コントローラー ミドルウェアが複数のサーバー インスタンスにリクエストを送信し、セッション シークレットを設定しないと、サーバーごとに 1 つだけ作成され、セッションが中断されるためです。

于 2013-02-19T22:23:46.893 に答える