何らかの理由: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.com
othersub.yourdomain.com
yourdomain.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を、詳細についてはこのメモを参照してください。
うまくいけば、それはそれを行う必要があります。クロスサブドメインサイトが一般的であると感じているので、なぜプロセスがこれほど複雑なのか完全にはわかりません。これらの各ステップの背後にある理由について誰かがさらに洞察を持っている場合は、コメントで私たちに教えてください。