何らかの理由:all
で、ドメインへの置き換えが機能しませんでした(レール3.2.11)。それを修正するには、カスタムミドルウェアが必要でした。そのソリューションの概要は以下のとおりです。
tl; dr:カスタムのラックミドルウェアを作成する必要があります。に追加する必要がありますconifg/environments/[production|development].rb
。これはRails 3.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:カスタムミドルウェアクラスを追加する
これが、Rack Middlewareの出番です。関連するラックとレールのリソース:
ここではあなたが追加する必要があることカスタムクラスであるlib
によって書かれたこの@Naderは、あなたのすべては彼に感謝すべきです
# 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:Rails設定に追加する
libにカスタムクラスがあるので、それをオートロードしていることを確認してください。それがあなたにとって何の意味もないなら、ここを見てください:Rails 3 autoload
最初に、Cookieストアを使用してシステム全体にアクセスできるようにします。ではconfig/application.rb
、Cookieストアを使用するようにRailsに指示します。
# 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トリックはlocalhostにマップします。それは素晴らしいです。詳細については、サブドメインに関するこのRailscastとこのメモを参照してください。
うまくいけば、それでうまくいくでしょう。クロスサブドメインのサイトが一般的だと思うので、私は正直に言って、プロセスがこれほど複雑である理由を完全に確信していません。これらの各手順の背後にある理由について誰かがさらに洞察を持っている場合は、コメントで教えてください。