Debo estar perdiendo algo básico sobre las cookies. En localhost, cuando configuro una cookie en el lado del servidor y especifico el dominio explícitamente como localhost (o .localhost). la cookie no parece ser aceptada por algunos navegadores.
Firefox 3.5: verifiqué la solicitud HTTP en Firebug. Lo que veo es:
Set-Cookie:
name=value;
domain=localhost;
expires=Thu, 16-Jul-2009 21:25:05 GMT;
path=/
o (cuando configuro el dominio en .localhost):
Set-Cookie:
name=value;
domain=.localhost;
expires=Thu, 16-Jul-2009 21:25:05 GMT;
path=/
En cualquier caso, la cookie no se almacena.
IE8: no utilicé ninguna herramienta adicional, pero la cookie no parece estar almacenada también, porque no se devuelve en solicitudes posteriores.
Opera 9.64: tanto localhost como .localhost funcionan , pero cuando verifico la lista de cookies en Preferencias, el dominio se establece en localhost.local a pesar de que aparece en localhost (en el grupo de listas).
Safari 4: tanto localhost como .localhost funcionan , pero siempre se enumeran como .localhost en Preferencias. Por otro lado, una cookie sin un dominio explícito, se muestra como solo localhost (sin punto).
¿Cuál es el problema con localhost? Debido a tal cantidad de inconsistencias, debe haber algunas reglas especiales que involucren localhost. Además, no está completamente claro para mí por qué los dominios deben tener el prefijo de un punto. RFC 2109 declara explícitamente que:
El valor del atributo Dominio no contiene puntos incrustados o no comienza con un punto.
¿Por qué? El documento indica que tiene que hacer algo con seguridad. Tengo que admitir que no he leído toda la especificación (puede que lo haga más tarde), pero suena un poco extraño. En base a esto, sería imposible establecer cookies en localhost.
Respuestas:
Por diseño, los nombres de dominio deben tener al menos dos puntos; de lo contrario, el navegador los considerará inválidos. (Ver referencia en http://curl.haxx.se/rfc/cookie_spec.html )
Cuando se trabaja
localhost
, el dominio de la cookie debe omitirse por completo. Sólo estableciéndolo en""
oNULL
, oFALSE
en lugar de"localhost"
, no es suficiente.Para PHP, vea los comentarios en http://php.net/manual/en/function.setcookie.php#73107 .
Si trabaja con la API de Java Servlet, no llame al
cookie.setDomain("...")
método en absoluto.fuente
Domain=
parámetro al configurar la cookie. Si solo configura el dominio como nulo o vacío, ¿tal vez su marco enviará elDomain=
parámetro con ese valor, en lugar de omitirlo? Consulte con, por ejemplo, Firebug.((domain && domain !== "localhost") ? ";domain="+domain : "")
Estoy ampliamente de acuerdo con @Ralph Buchfelder, pero aquí hay algo de amplificación de esto, al experimentar al intentar replicar un sistema con varios subdominios (como example.com, fr.example.com, de.example.com) en mi máquina local ( OS X / Apache / Chrome | Firefox).
Edité / etc / hosts para señalar algunos subdominios imaginarios en 127.0.0.1:
Si estoy trabajando en fr.localexample.com y dejo fuera el parámetro de dominio, la cookie se almacena correctamente para fr.localexample.com, pero no es visible en los otros subdominios.
Si uso un dominio de ".localexample.com", la cookie se almacena correctamente para fr.localexample.com y es visible en otros subdominios.
Si uso un dominio de "localexample.com", o cuando estaba probando un dominio de solo "localexample" o "localhost", la cookie no se almacenaba.
Si uso un dominio de "fr.localexample.com" o ".fr.localexample.com", la cookie se almacena correctamente para fr.localexample.com y es (correctamente) invisible en otros subdominios.
Por lo tanto, el requisito de que necesite al menos dos puntos en el dominio parece ser correcto, aunque no entiendo por qué debería serlo.
Si alguien quiere probar esto, aquí hay un código útil:
fuente
localhost: puede usar:
domain: ".app.localhost"
y funcionará. El parámetro 'dominio' necesita 1 o más puntos en el nombre de dominio para configurar las cookies. A continuación, puede tener sesiones de trabajo a través de los subdominios localhost tales como:api.app.localhost:3000
.fuente
express.session({cookie: { domain: '.app.localhost', maxAge: 24 * 60 * 60 * 1000 }})
.app.
viene este antecedente de la venida? ¿Es parte de algunas especificaciones? ¿Y es aplicable para todos los dominios no conformes (aquellos sin dos puntos)? Además, ¿funcionará con navegadores antiguos? : ^)Cuando se configura una cookie con un dominio explícito de 'localhost' de la siguiente manera ...
... luego los navegadores lo ignoran porque no incluye al menos dos períodos y no es uno de los siete dominios de nivel superior manejados especialmente .
Tenga en cuenta que el número de períodos anteriores probablemente supone que se requiere un período inicial. Sin embargo, este período se ignora en los navegadores modernos y probablemente debería leer ...
Tenga en cuenta que el valor predeterminado para el atributo de dominio es el nombre de host del servidor que generó la respuesta de cookie .
Por lo tanto, una solución alternativa para las cookies que no se configuran para localhost es simplemente no especificar un atributo de dominio y dejar que el navegador use el valor predeterminado; esto no parece tener las mismas restricciones que un valor explícito en el atributo de dominio.
fuente
Resultados que había variado por navegador.
Chrome- 127.0.0.1 funcionó pero localhost .localhost y "" no. Firefox- .localhost funcionó pero localhost, 127.0.0.1 y "" no.
No he probado en Opera, IE o Safari
fuente
Domain=
parámetro funciona.Domain=
También funciona, peroDomain=localhost
no funciona.Pasé mucho tiempo resolviendo este problema yo mismo.
Usar PHP y Nothing en esta página me funcionó. Finalmente me di cuenta en mi código que el parámetro 'seguro' para el session_set_cookie_params () de PHP siempre se estaba configurando como VERDADERO.
Como no estaba visitando localhost con https, mi navegador nunca aceptaría la cookie. Entonces, modifiqué esa parte de mi código para establecer condicionalmente el parámetro 'seguro' basado en que $ _SERVER ['HTTP_HOST'] sea 'localhost' o no. Trabajando bien ahora.
Espero que esto ayude a alguien.
fuente
Si está configurando una cookie de otro dominio (es decir, configura la cookie al hacer una solicitud de origen cruzado XHR), entonces debe asegurarse de establecer el
withCredentials
atributo en verdadero en la solicitud XMLHttpRequest que utiliza para recuperar la cookie como se describe aquífuente
puede utilizar
localhost.org
o, mejor.localhost.org
dicho, siempre resolverá127.0.0.1
fuente
Tuve mucha mejor suerte probando localmente usando 127.0.0.1 como dominio. No estoy seguro de por qué, pero tuve resultados mixtos con localhost y .localhost, etc.
fuente
Ninguna de las soluciones sugeridas funcionó para mí: establecerla como nula, falsa, agregar dos puntos, etc., no funcionó.
Al final, acabo de eliminar el dominio de la cookie si es localhost y eso ahora funciona para mí en Chrome 38 .
Código anterior (no funcionó):
Nuevo código (ahora funcionando):
fuente
Tuve el mismo problema y lo solucioné poniendo 2 puntos en el nombre de la cookie sin especificar ningún dominio.
fuente
Parece que hay un problema cuando lo usas
https://<local-domain>
y luegohttp://<local-domain>
. Elhttp://
sitio no envía cookies con solicitudes después de que elhttps://
sitio las configura. Forzar recarga y borrar caché no ayuda. Solo funciona la eliminación manual de cookies. Además, si los borro en lahttps://
página, lahttp://
página comienza a funcionar nuevamente.Parece estar relacionado con "Cookies seguras estrictas". Buena explicación aquí . Fue lanzado en Chrome 58 el 19/04/2017.
Parece que Chrome de hecho registra cookies seguras y no seguras, ya que mostrará las cookies correctas según el protocolo de la página al hacer clic en el icono de la barra de direcciones.
Pero
Developer tools > Application > Cookies
no mostrará una cookie no segura cuando haya una cookie segura con el mismo nombre para el mismo dominio, ni enviará la cookie no segura con ninguna solicitud. Esto parece un error de Chrome, o si se espera este comportamiento, debería haber alguna forma de ver las cookies seguras en unahttp
página y una indicación de que se están anulando.La solución consiste en utilizar diferentes cookies con nombre dependiendo de si son para un sitio http o https, y nombrarlas específicamente para su aplicación. Un
__Secure-
prefijo indica que la cookie debe ser estrictamente segura, y también es una buena práctica porque seguro y no seguro no colisionará. También hay otros beneficios para los prefijos.El uso de diferentes
/etc/hosts
dominios para https frente a acceso http también funcionaría, pero unahttps://localhost
visita accidental evitará que las cookies del mismo nombre funcionen en loshttp://localhost
sitios, por lo que esta no es una buena solución.He presentado un informe de error de Chrome .
fuente
document.cookie = valuename + "=" + value + ";" + caduca + "; dominio =; ruta = /";
este "dominio =; ruta = /"; tomará un dominio dinámico ya que su cookie funcionará en el subdominio. si quieres probar en localhost funcionará
fuente
Ninguna de las respuestas aquí funcionó para mí. Lo arreglé colocando mi PHP como lo primero en la página.
Al igual que otros encabezados, las cookies deben enviarse antes de cualquier salida de su script (esta es una restricción de protocolo). Esto requiere que realice llamadas a esta función antes de cualquier salida, incluidas las etiquetas y cualquier espacio en blanco.
De http://php.net/manual/en/function.setcookie.php
fuente
Hay un problema con Chromium abierto desde 2011 , que si está configurando explícitamente el dominio como 'localhost', debe configurarlo como
false
oundefined
.fuente
Estaba jugando un poco.
funciona en Firefox y Chrome a partir de hoy. Sin embargo, no encontré una manera de hacerlo funcionar con curl. Intenté Host-Header y --resolver, sin suerte, cualquier ayuda apreciada.
Sin embargo, funciona en curl, si lo configuro en
en lugar. (Que no funciona con Firefox).
fuente
Otro detalle importante, expires = debe usar el siguiente formato de fecha y hora: Wdy, DD-Mon-AAAA HH: MM: SS GMT ( RFC6265 - Sección 4.1.1 ).
fuente
Después de mucha experimentación y lectura de varias publicaciones, esto funcionó. Podría configurar varias cookies, volver a leerlas y configurar el tiempo negativo y eliminarlas.
fuente
Lo único que funcionó para mí fue establecer
Path=/
la cookie.Además, el valor predeterminado de un atributo de ruta parece ser diferente de los navegadores a los navegadores, aunque probé solo dos de ellos (Firefox y Chrome).
Chrome intenta establecer una cookie tal como está; Si el
path
atributo se omite en elSet-Cookie
encabezado, no se almacenará ni se ignorará.Sin embargo, Firefox almacena una cookie incluso sin un
path
atributo explícito . Simplemente lo configuró con la ruta solicitada; mi URL de solicitud era/api/v1/users
y la ruta se configuró/api/v1
automáticamente.De todos modos, ambos navegadores funcionaron cuando
path
se configuró/
incluso sin un dominio explícito, es decir,Domain=localhost
o algo así. Por lo tanto, hay algunas diferencias en la forma en que cada navegador maneja las cookies.fuente