レール 3.2.12、ルビー 1.9.3
のようなサブドメインを使用して所属する会社をユーザーが指定できるようにしていますがmycompany.example.com
、正規のドメインにリダイレクトするためexample.com
、ユーザーの出身地を覚えておく必要がありますmycompany
。
config.session_store
を含むように環境をセットアップしました:domain => 'example.com
(これも機能する代替手段は です:domain => :all, :tld_length => 2
)。これは、サブドメイン間でセッション情報を共有できるように機能するはずです。Rails でサブドメイン間でセッション (Cookie) を共有しますか?
しかし、リダイレクトの前にsession.inspect
ログに送信していますが、明らかに別のセッション (2 つの個別のセッション ID など) を取得しています。したがって、最も基本的な問題は、セッションを使用してそのmycompany
部分を覚えておくことができないということです。
私はそれを回避することができますが、同じユーザーが複数の会社に所属している場合が多数あります (これには、会社を切り替えることができるようにする必要があるサポート チームも含まれます)。
OS XのChromeとSafariでこれを試しました。「pow」を使用しているため、ローカル開発環境には、example.dev
いくつかの問題を除外するのに役立つようなドメインがあります(通常のlocalhost:3000
サーバーに対して)。
何か不足していますか?ドメイン間で Cookie を共有することは本当に可能ですか?
アップデート:
で定義された before_filter で呼び出されるコード例ApplicationController
:
def redirect_to_canonical_if_needed
logger.debug "Starting before_filter. session contains: #{session}"
if request.host != 'example.com'
session[:original_domain] = "Originally came from #{request.host}"
logger.debug "Redirecting, session contains: #{session}"
redirect_to 'http://example.com', :status => :moved_permanently
end
end
設定の追加config/environments/production.rb
と削除config/initializers/session_store.rb
config.session_store = { :key => 'example_session', :secret => "secret", :domain => :all, :tld_length => 2 }
また
config.session_store = { :key => 'example_session', :secret => "secret", :domain => 'example.com' }
そして、URL a.example.com に行くセッションが存在しない新しい環境から開始した場合のログ結果:
Starting before_filter, session contains: {}
Redirecting, session contains: {"session_id"=>"4de9b56fb540f7295cd3192cef07ba63", "original_domain"=>"a.example.com"}
Filter chain halted as :redirect_to_canonical_if_needed rendered or redirected
Completed 301 Moved Permanently in 2294ms (ActiveRecord: 855.7ms)
Started GET "/" for 123.456.789.123 at 2013-07-12 09:41:12 -0400
Processing by HomeController#index as HTML
Parameters: {}
Starting before_filter, session contains: {}
そのため、新しいリクエストごとに before フィルタが起動します。最初のリクエストにはセッションがないため、「ロードされていません」というメッセージが表示されます。リダイレクトの必要性のテストは true です。セッションに何かを入れると、ID と入れたものが取得されます。リダイレクトを行います。フィルターが再び起動する前に、ルート ドメインで新しい要求が発生します。問題は次のとおりです。セッションが初期化されていません