96

各ユーザーが会社に属し、その会社にサブドメインがあるアプリのセットアップがあります(私はbasecampスタイルのサブドメインを使用しています)。私が直面している問題は、railsが複数のCookie(1つはlvh.me用、もう1つはsubdomain.lvh.me用)を作成していることです。サインイン)。

これは/cofig/initilizers/session_store.rbファイルにあります。

AppName::Application.config.session_store :cookie_store, key: '_application_devise_session', domain: :all

ドメイン::allは私がGoogleで見つけた標準的な答えのようですが、それは私にとってはうまくいかないようです。どんな助けでも大歓迎です!

4

9 に答える 9

79

'domain:all'は、そのセッション中にアクセスされるすべての異なるサブドメインのCookieを作成します(そして、それらがリクエスト間で確実に渡されるようにします)。ドメイン引数が渡されない場合は、同じセッションでアクセスされる異なるドメインごとに新しいCookieが作成され、古いCookieは破棄されることを意味します。私が必要としていたのは、ドメインが変更された場合でも、セッション全体を通じて永続する単一のCookieでした。したがって、合格domain: "lvh.me"は開発の問題を解決しました。これにより、異なるサブドメイン間でそこにとどまる単一のCookieが作成されます。

さらに説明が必要な人にとっては、これは素晴らしいリンクです: http: //excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/

于 2012-05-01T19:46:41.350 に答える
70

http://excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/

「ここで注意したいのは、:domain =>:all likeを設定した場合、一部の場所で推奨されている場合、localhostを使用しない限り機能しないことです。:allのデフォルトはTLDの長さ1です。 、つまり、Pow(myapp.dev)でテストしている場合、長さ2のTLDであるため、どちらも機能しません。」

言い換えれば、あなたは必要です:

 App.config.session_store ... , :domain => :all, :tld_length => 2

また、Cookieをクリアすることをお勧めします

于 2013-02-21T18:39:46.517 に答える
24

ドメイン名を明示的に指定せずにこの問題を解決する方法を探していたので、session_store.rbファイルを編集し続けることなく、localhost、lvh.me、および本番環境で使用するドメイン間を移動できました。ただし、「domain::all」の設定はうまくいかなかったようです。

最終的に、その式でtld_length(トップレベルドメインの長さ)を記述する必要があることがわかりました。たとえば、デフォルトのtld_lengthは1ですが、example.lvh.meのtld_lengthは2で、127.0.0.1.xip.ioのtld_lengthは5です。したがって、開発中および本番環境でのlvh.meのサブドメインのsession_store.rbファイルにあるものは以下のとおりです。

MyApp::Application.config.session_store :cookie_store, key: '_MyApp_session', domain: :all, tld_length: 2

この答えを見つけるのに長い時間がかかったので、これが誰かに役立つことを願っています!

于 2013-11-12T11:39:04.373 に答える
19

何らかの理由:allで、ドメインへの置き換えは機能しませんでした(レール3.2.11)。それを修正するには、カスタムミドルウェアが必要でした。そのソリューションの概要は以下のとおりです。

tl; dr:カスタムラックミドルウェアを作成する必要があります。あなたはそれをあなたのに追加する必要がありますconifg/environments/[production|development].rb。これはRails3.2.11にあります

Cookieセッションは通常、トップレベルドメインに対してのみ保存されます。

を見ると、Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}ととの個別のエントリがあることがわかりますsub1.yourdomain.comothersub.yourdomain.comyourdomain.com

課題は、すべてのサブドメインで同じセッションストアファイルを使用することです。

ステップ1:カスタムミドルウェアクラスを追加する

これがRackMiddlewareの出番です。いくつかの関連するRack&Railsリソース:

これはあなたが追加する必要があるカスタムクラスですこれは@Naderlib によって書かれましたそしてあなたはすべて彼に感謝するべきです

# Custom Domain Cookie
#
# Set the cookie domain to the custom domain if it's present
class CustomDomainCookie
  def initialize(app, default_domain)
    @app = app
    @default_domain = default_domain
  end

  def call(env)
    host = env["HTTP_HOST"].split(':').first
    env["rack.session.options"][:domain] = custom_domain?(host) ? ".#{host}" : "#{@default_domain}"
    @app.call(env)
  end

  def custom_domain?(host)
    host !~ /#{@default_domain.sub(/^\./, '')}/i
  end
end

基本的に、これは、すべてのCookieセッションデータを、ルートドメインとまったく同じCookieファイルにマップして戻すことを目的としています。

ステップ2:RailsConfigに追加

libにカスタムクラスがあるので、それを自動ロードしていることを確認してください。それがあなたにとって何の意味もない場合は、ここを見てください:Rails 3 autoload

まず、Cookieストアをシステム全体で使用していることを確認します。ではconfig/application.rb、RailsにCookieストアを使用するように指示します。

# We use a cookie_store for session data
config.session_store :cookie_store,
                     :key => '_yourappsession',
                     :domain => :all

これがここに記載されている理由は、:domain => :all線のためです。:domain => ".yourdomain.com"の代わりに指定することを提案している他の人々がいます:domain => :all。何らかの理由でこれは私には機能せず、上記のカスタムミドルウェアクラスが必要でした。

次に、config/environments/production.rb追加で:

config.middleware.use "CustomDomainCookie", ".yourdomain.com"

前のドットが必要であることに注意してください。理由については、「親ドメインリクエストで送信されたサブドメインCookie? 」を参照してください。

次に、config/environments/development.rb追加で:

config.middleware.use "CustomDomainCookie", ".lvh.me"

lvh.meトリックはローカルホストにマップされます。それは素晴らしいです。サブドメインについてはこのRailscastを、詳細についてはこのメモを参照してください。

うまくいけば、それはそれを行う必要があります。クロスサブドメインサイトが一般的であると感じているので、なぜプロセスがこれほど複雑なのか完全にはわかりません。これらの各ステップの背後にある理由について誰かがさらに洞察を持っている場合は、コメントで私たちに教えてください。

于 2013-02-06T21:59:14.823 に答える
18

Cookieをルートドメインに設定する最も簡単な方法を探しているときに、これに遭遇しました。:allドメインオプションとして渡された場合、オプションに関する誤った情報があるようです。ほとんどのドメインでは、実際には期待どおりに機能し、Cookieをルートドメインに設定します(例.example.com:)test.example.comlvh.meドメインを使用してテストしているため、ほとんどの人が問題を経験したと思います。Railsがトップレベルドメインを見つけるために使用する正規表現は、と定義されていますDOMAIN_REGEXP = /[^.]*\.([^.]*|..\...|...\...)$/。最後の部分に注意すると、railsが。lvh.meに似たTLDとして解釈されることがわかりますcom.au。ユースケースがlvh.me機能する必要がある場合、この:allオプションは適切に機能しませんが、ほとんどのドメインにとって最も単純で最良のオプションのようです。

TL; DR、ここでの正解は、3文字のドメイン(または上記の正規表現を混乱させるドメイン)で開発していないと仮定すると、を使用すること:allです。

于 2013-07-16T01:43:16.247 に答える
8

Rails 4.x(Rails 5/6バージョンでも問題ないはずです)

ローカルホストでlvh.me:3000とサブドメインを取得する方法(Rails)

.lvh.me開発:私はに追加するためにクッキーを共有しましたsession_store.rb

localhostadmin.lvh.me:3000などのサブドメイン間で共有さlvh.me:3000れます...

#config/initializers/session_store.rb

domain = Rails.env.production? ? ".domain_name.com" : ".lvh.me"

Rails.application.config.session_store :cookie_store, 
                      key: '_app_name_session', domain: domain
于 2017-03-26T01:12:02.727 に答える
4

試しましたか

AppName::Application.config.session_store :cookie_store, key: '_application_devise_session', domain: 'lvh.me'  

)。

基本的に、ベースドメインには単一のCookieがあり、サブドメインは無視すると言っていますが、このアプローチにはまだいくつかの欠陥があります...

于 2012-05-01T19:51:47.517 に答える
2

サポートレール5

必要に応じて、任意のドメインで機能します。

Rails.application.config.session_store :cookie_store, key: '_my_app_session', domain: :all, tld_length: 2

環境ごとに構成するには、以下を使用できます。

Rails.application.config.session_store :cookie_store, key: '_my_app_session', domain: {
  production: '.example.com',
  development: '.example.dev'
}.fetch(Rails.env.to_sym, :all)

参照:https ://github.com/plataformatec/devise/wiki/How-To:-Use-subdomains

于 2018-10-18T03:18:21.240 に答える
0

セッションストアにRedisを使用している場合。

if Rails.env.development?
    Rails.application.config.session_store :redis_store, {
       servers: [
        { host: 'localhost', port: 6379},
      ],
      key: '_app_session',
      expire_after: 1.day,
      domain: :all
    }

else
    Rails.application.config.session_store :redis_store, {
       servers: [
        { host: HOST_URL, port: PORT},
      ],
      key: '_app_session',
      expire_after: 1.day,
      domain: '.domain.com',
      tld_length: 2
    }
    
end 
于 2020-06-25T04:39:32.510 に答える