Z jakiegoś powodu podmiana :all
domeny nie zadziałała (szyny 3.2.11) u mnie. Naprawienie tego wymagało niestandardowego oprogramowania pośredniczącego. Podsumowanie tego rozwiązania znajduje się poniżej.
tl; dr: Musisz napisać niestandardowe oprogramowanie pośredniczące do stojaka. Musisz dodać to do swojego conifg/environments/[production|development].rb
. To jest na Railsach 3.2.11
Sesje cookie są zwykle przechowywane tylko dla domeny najwyższego poziomu.
Jeśli zajrzysz do Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}
środka, zobaczysz, że będą osobne wpisy dla sub1.yourdomain.com
i othersub.yourdomain.com
iyourdomain.com
Wyzwaniem jest użycie tego samego pliku magazynu sesji we wszystkich subdomenach.
Krok 1: Dodaj niestandardową klasę oprogramowania pośredniego
W tym miejscu pojawia się oprogramowanie pośredniczące do szaf serwerowych . Niektóre odpowiednie zasoby dotyczące szaf i szyn:
Oto niestandardowa klasa, którą powinieneś dodać w lib
To zostało napisane przez @Nader i wszyscy powinniście mu podziękować
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
Zasadniczo powoduje to mapowanie wszystkich danych sesji plików cookie z powrotem do dokładnie tego samego pliku cookie, który jest równy domenie głównej.
Krok 2: Dodaj do konfiguracji Railsów
Teraz, gdy masz już klasę niestandardową w bibliotece, upewnij się, że ładujesz ją automatycznie. Jeśli to nic dla ciebie nie znaczyło, spójrz tutaj: Automatyczne ładowanie Rails 3
Pierwszą rzeczą jest upewnienie się, że korzystasz z magazynu plików cookie w całym systemie. W tym config/application.rb
informujemy Railsy, aby używały magazynu plików cookie.
config.session_store :cookie_store,
:key => '_yourappsession',
:domain => :all
Powodem, dla którego jest to tutaj wspomniane, jest :domain => :all
linia. Są inne osoby, które zasugerowały określenie :domain => ".yourdomain.com"
zamiast :domain => :all
. Z jakiegoś powodu to nie zadziałało i potrzebowałem niestandardowej klasy oprogramowania pośredniego, jak opisano powyżej.
Następnie w Twoim config/environments/production.rb
dodatku:
config.middleware.use "CustomDomainCookie", ".yourdomain.com"
Zwróć uwagę, że poprzedzająca kropka jest konieczna. Zobacz temat „ Pliki cookie subdomeny wysłane w żądaniu domeny nadrzędnej? ”, Aby dowiedzieć się, dlaczego.
Następnie w Twoim config/environments/development.rb
dodatku:
config.middleware.use "CustomDomainCookie", ".lvh.me"
Sztuczka lvh.me jest mapowana na localhost. To jest zajebiste. Zobacz ten Railscast o subdomenach i tę notatkę po więcej informacji.
Mam nadzieję, że to powinno wystarczyć. Szczerze mówiąc, nie jestem do końca pewien, dlaczego ten proces jest tak zawiły, ponieważ uważam, że witryny krzyżowe z subdomenami są powszechne. Jeśli ktoś ma jakieś dodatkowe informacje na temat przyczyn każdego z tych kroków, prosimy o wyjaśnienie nas w komentarzach.