어떤 이유로 :all
도메인 교체 가 작동하지 않았습니다 (rails 3.2.11). 이를 고치기 위해 커스텀 미들웨어가 필요했습니다. 해당 솔루션에 대한 요약은 다음과 같습니다.
tl; dr : 맞춤형 랙 미들웨어를 작성해야합니다. 당신은 그것을 당신의 conifg/environments/[production|development].rb
. 이것은 Rails 3.2.11에 있습니다.
쿠키 세션은 일반적으로 최상위 도메인에 대해서만 저장됩니다.
을 살펴보면 과 와에 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에 의해 작성되었으며 모두 감사해야합니다.
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
기본적으로 이것이하는 일은 모든 쿠키 세션 데이터를 루트 도메인과 동일한 동일한 쿠키 파일에 다시 매핑하는 것입니다.
2 단계 : Rails 구성에 추가
이제 lib에 사용자 정의 클래스가 있으므로 자동로드되는지 확인하십시오. 아무 의미가 없다면 여기를보세요 : Rails 3 autoload
첫 번째는 쿠키 저장소를 사용하여 시스템 전체에 있는지 확인하는 것입니다. 에서 config/application.rb
우리는 쿠키 저장소를 사용하도록 레일을 말한다.
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"
앞의 점이 필요합니다. 이유는 " 상위 도메인 요청에서 전송 된 하위 도메인 쿠키입니까? "를 참조하십시오 .
그런 다음 config/environments/development.rb
추가 :
config.middleware.use "CustomDomainCookie", ".lvh.me"
lvh.me 트릭은 localhost에 매핑됩니다. 그것은 굉장. 참조 하위 도메인에 대한이 Railscast 및 메모 추가 정보를 원하시면 있습니다.
바라건대 그렇게해야합니다. 나는 교차 하위 도메인 사이트가 일반적이라고 생각하기 때문에 프로세스가 왜 이렇게 복잡한 지 완전히 확신하지 못합니다. 이러한 각 단계의 이유에 대해 더 많은 통찰력이있는 사람이 있으면 의견을 통해 알려주십시오.