cookies - guardar - setcookie javascript
Cookies en localhost con dominio explĂcito (15)
Cuando una cookie se establece con un dominio explícito de ''localhost'' de la siguiente manera ...
Set-Cookie: nombre = valor; dominio = localhost ; expira = Jue, 16-Jul-2009 21:25:05 GMT; camino = /
... luego los navegadores lo ignoran porque http://curl.haxx.se/rfc/cookie_spec.html .
... los dominios deben tener al menos dos (2) o tres (3) períodos en ellos para evitar dominios de la forma: ".com", ".edu" y "va.us". Cualquier dominio que falle dentro de uno de los siete dominios especiales de nivel superior enumerados a continuación solo requiere dos períodos. Cualquier otro dominio requiere al menos tres. Los siete dominios especiales de nivel superior son: "COM", "EDU", "NET", "ORG", "GOV", "MIL" e "INT".
Tenga en cuenta que el número de períodos anteriores probablemente asuma que se requiere un período principal. Sin embargo, este período se ignora en los navegadores modernos y probablemente debería leer ...
al menos uno (1) o dos (2) períodos
Tenga en cuenta que el valor predeterminado para el atributo de dominio es http://curl.haxx.se/rfc/cookie_spec.html .
Por lo tanto, una solución alternativa para las cookies que no se establecen 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.
Debo perderme algo básico sobre las cookies. En localhost, cuando configuro una cookie en el 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 a .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 usé ninguna herramienta adicional, pero la cookie tampoco parece estar almacenada, porque no se envía nuevamente en solicitudes posteriores.
Opera 9.64: Tanto el localhost como el .localhost funcionan , pero cuando consulto la lista de cookies en Preferencias, el dominio se establece en localhost.local aunque esté en la lista bajo el localhost (en la lista de grupos).
Safari 4: tanto el localhost como el .localhost funcionan , pero siempre aparecen 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á del todo claro para mí por qué los dominios deben estar precedidos por un punto? RFC 2109 establece explícitamente que:
El valor para el atributo de 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 hacerlo más tarde), pero suena un poco extraño. En base a esto, establecer cookies en localhost sería imposible.
Estaba jugando un poco.
Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=localhost; Path=/
funciona en Firefox y Chrome a partir de hoy. Sin embargo, no encontré la manera de hacerlo funcionar con curl. Intenté Host-Header y resuelto, sin suerte, agradecí cualquier ayuda.
Sin embargo, funciona en curl, si lo configuro
Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=127.0.0.1; Path=/
en lugar. (Lo cual no funciona con Firefox)
Estoy totalmente de acuerdo con @Ralph Buchfelder, pero aquí hay una ampliación de esto, mediante un experimento al intentar replicar un sistema con varios subdominios (como example.com, fr.ejemplo.com, de.ejemplo.com) en mi máquina local ( OS X / Apache / Chrome | Firefox).
He editado / etc / hosts para señalar algunos subdominios imaginarios en 127.0.0.1:
127.0.0.1 localexample.com
127.0.0.1 fr.localexample.com
127.0.0.1 de.localexample.com
Si estoy trabajando en fr.localexample.com y dejo el parámetro de dominio fuera, la cookie se almacena correctamente para fr.localexample.com, pero no está visible en los otros subdominios.
Si utilizo 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 intentando un dominio de solo "localexample" o "localhost", la cookie no se estaba almacenando.
Si utilizo 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 necesita al menos dos puntos en el dominio parece ser correcto, aunque no puedo ver por qué debería ser así.
Si alguien quiere probar esto, aquí hay un código útil:
<html>
<head>
<title>
Testing cookies
</title>
</head>
<body>
<?php
header(''HTTP/1.0 200'');
$domain = ''fr.localexample.com''; // Change this to the domain you want to test.
if (!empty($_GET[''v''])) {
$val = $_GET[''v''];
print "Setting cookie to $val<br/>";
setcookie("mycookie", $val, time() + 48 * 3600, ''/'', $domain);
}
print "<pre>";
print "Cookie:<br/>";
var_dump($_COOKIE);
print "Server:<br/>";
var_dump($_SERVER);
print "</pre>";
?>
</body>
</html>
Existe un problema en Chromium abierto desde 2011 , que si configura explícitamente el dominio como ''localhost'', debe establecerlo como false
o undefined
.
Ninguna de las correcciones sugeridas funcionó para mí, configurándola como nula, falsa, agregando dos puntos, etc., no funcionó.
Al final, simplemente eliminé el dominio de la cookie si es localhost y eso ahora me funciona en Chrome 38 .
Código anterior (no funcionó):
document.cookie = encodeURI(key) + ''='' + encodeURI(value) + '';domain=.'' + document.domain + '';path=/;'';
Nuevo código (ahora funciona):
if(document.domain === ''localhost'') {
document.cookie = encodeURI(key) + ''='' + encodeURI(value) + '';path=/;'' ;
} else {
document.cookie = encodeURI(key) + ''='' + encodeURI(value) + '';domain=.'' + document.domain + '';path=/;'';
}
Ninguna de las respuestas aquí funcionó para mí. Lo arreglé poniendo mi PHP como lo primero de la página.
Al igual que otros encabezados, las cookies deben enviarse antes de cualquier salida de su secuencia de comandos (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.
Otro detalle importante, el expira = debe usar el siguiente formato de fecha y hora: Wdy, DD-Mon-AAAA HH: MM: SS GMT ( RFC6265 - Sección 4.1.1 ).
Set-Cookie:
name=value;
domain=localhost;
expires=Thu, 16-07-2019 21:25:05 GMT;
path=/
Parece que hay un problema cuando utiliza https://<local-domain>
y luego http://<local-domain>
. El sitio http://
no envía cookies con las solicitudes una vez que el sitio https://
establece. Force Reload y Clear Cache no ayuda. Solo funciona la limpieza manual de cookies. Además, si los https://
en la página https://
, la página http://
comienza a funcionar nuevamente.
Parece estar relacionado con "Estrictas cookies seguras". Buena explicación here . Fue lanzado en Chrome 58 el 2017-04-19.
Parece que Chrome 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 las Developer tools > Application > Cookies
no mostrarán una cookie no segura cuando haya una cookie segura del 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 cuando se encuentra en una página http
y una indicación de que están siendo anuladas.
La solución consiste en utilizar diferentes cookies con nombre, según si son para un sitio http o un sitio https, y para asignarles un nombre específico a su aplicación. Un prefijo __Secure-
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 vs. http de acceso también funcionaría, pero una visita https://localhost
evitará que las cookies de los mismos nombres funcionen en http://localhost
sites - así que esto no es bueno solución alternativa
He archivado un informe de error de Chrome .
Pasé una gran cantidad de tiempo solucionando este problema yo mismo.
Usar PHP y Nothing en esta página funcionó para mí. Finalmente me di cuenta en mi código que el parámetro ''seguro'' de session_set_cookie_params () de PHP siempre se estaba estableciendo en TRUE.
Como no visitaba localhost con https, mi navegador nunca aceptaría la cookie. Entonces, modifiqué esa porción de mi código para establecer condicionalmente el parámetro ''seguro'' basado en $ _SERVER [''HTTP_HOST''] que es ''localhost'' o no. Trabajando bien ahora
Espero que esto ayude a alguien.
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 )
Al trabajar en localhost
, el dominio de la cookie debe omitirse por completo. Simplemente configurarlo en ""
o NULL
o FALSE
lugar de "localhost"
no es suficiente.
Para PHP, consulte los comentarios en http://php.net/manual/en/function.setcookie.php#73107 .
Si trabaja con Java Servlet API, no llame al cookie.setDomain("...")
.
Resultados que he variado por navegador.
Chrome-127.0.0.1 funcionaba pero localhost .localhost y "" no. Firefox- .localhost funcionaba pero localhost, 127.0.0.1 y "" no.
No he probado en Opera, IE o Safari
Tuve el mismo problema y lo solucioné poniendo 2 puntos en el nombre de la cookie sin especificar ningún dominio.
set-cookie: name.s1.s2=value; path=/; expires=Sun, 12 Aug 2018 14:28:43 GMT; HttpOnly
Tuve mucha mejor suerte probando localmente usando 127.0.0.1 como el dominio. No estoy seguro de por qué, pero tuve resultados mixtos con localhost y .localhost, etc.
document.cookie = valuename + "=" + value + ";" + expires + "; domain =; path = /";
este "dominio =; ruta = /"; tomará dominio dinámico ya que su cookie funcionará en el subdominio. si quieres probar en localhost, funcionará
localhost: Puedes usar: domain: ".app.localhost"
y funcionará. El parámetro ''dominio'' necesita 1 o más puntos en el nombre de dominio para establecer cookies. Luego puede hacer que las sesiones funcionen en los subdominios de los api.app.localhost:3000
locales, tales como: api.app.localhost:3000
.