Por alguna razón, reemplazar :all
con el dominio no funcionó (rieles 3.2.11) para mí. Se necesitó una pieza de Middleware personalizado para solucionarlo. A continuación se muestra un resumen de esa solución.
tl; dr: Necesita escribir un Rack Middleware personalizado. Necesita agregarlo a su conifg/environments/[production|development].rb
. Esto está en Rails 3.2.11
Las sesiones de cookies generalmente se almacenan solo para su dominio de nivel superior.
Si miras en Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}
Puedes ver que habrá entradas separadas para sub1.yourdomain.com
y othersub.yourdomain.com
yyourdomain.com
El desafío consiste en utilizar el mismo archivo de almacenamiento de sesión en todos los subdominios.
Paso 1: agregar una clase de middleware personalizada
Aquí es donde entra en juego Rack Middleware . Algunos recursos de rack y rieles relevantes:
Aquí hay una clase personalizada que debe agregar en el lib
Esto fue escrito por @Nader y todos deben agradecerle
# 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
Básicamente, lo que hace es que mapeará todos los datos de su sesión de cookies en el mismo archivo de cookies que es igual a su dominio raíz.
Paso 2: Agregar a la configuración de rieles
Ahora que tiene una clase personalizada en lib, asegúrese de cargarla automáticamente. Si eso no significa nada para usted, mire aquí: Autocarga de Rails 3
Lo primero es asegurarse de utilizar un almacén de cookies en todo el sistema. En config/application.rb
le decimos a Rails que use una tienda de cookies.
# We use a cookie_store for session data
config.session_store :cookie_store,
:key => '_yourappsession',
:domain => :all
La razón por la que esto está aquí se menciona aquí es por la :domain => :all
línea. Hay otras personas que han sugerido especificar en :domain => ".yourdomain.com"
lugar de :domain => :all
. Por alguna razón, esto no funcionó para mí y necesitaba la clase Middleware personalizada como se describe anteriormente.
Luego en su config/environments/production.rb
complemento:
config.middleware.use "CustomDomainCookie", ".yourdomain.com"
Tenga en cuenta que el punto anterior es necesario. Consulte " Cookies de subdominio, ¿enviadas en una solicitud de dominio principal? " Para saber por qué.
Luego en su config/environments/development.rb
complemento:
config.middleware.use "CustomDomainCookie", ".lvh.me"
El truco lvh.me se asigna a localhost. Es impresionante. Consulte este Railscast sobre subdominios y esta nota para obtener más información.
Con suerte, debería hacerlo. Honestamente, no estoy del todo seguro de por qué el proceso es tan complicado, ya que creo que los sitios de subdominios cruzados son comunes. Si alguien tiene más información sobre las razones detrás de cada uno de estos pasos, infórmenos en los comentarios.