Cookies en localhost con dominio explícito

Resuelto Jan Zich asked hace 15 años • 26 respuestas

Debo faltar 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 tampoco parece almacenarse porque no se devuelve en solicitudes posteriores.

Opera 9.64: Tanto localhost como .localhost funcionan , pero cuando reviso la lista de cookies en Preferencias, el dominio está configurado en localhost.local aunque aparece en localhost (en la agrupación de listas).

Safari 4: Tanto localhost como .localhost funcionan , pero siempre aparecen como .localhost en Preferencias. Por otro lado, una cookie sin un dominio explícito, que se muestra simplemente como localhost (sin punto).

¿Cuál es el problema con localhost? Debido a tal cantidad de inconsistencias, debe haber algunas reglas especiales que involucren a localhost. Además, no me queda del todo claro por qué los dominios deben tener el prefijo de un punto. RFC 2109 establece 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 ver algo con la seguridad. Tengo que admitir que no he leído la especificación completa (tal vez lo haga más adelante), pero suena un poco extraño. En base a esto, sería imposible configurar cookies en localhost.

Jan Zich avatar Jul 16 '09 04:07 Jan Zich
Aceptado

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 en , se debe omitir por completolocalhost el dominio de cookies . No debes configurarlo en o o en lugar de . No es suficiente.""NULLFALSE"localhost"

Para PHP, consulte los comentarios en http://php.net/manual/en/function.setcookie.php#73107 .

Si trabaja con la API de Servlet de Java, no llame al cookie.setDomain("...")método en absoluto.

Ralph Buchfelder avatar Jul 27 '2009 13:07 Ralph Buchfelder

Estoy ampliamente 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 ejemplo.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:

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 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 probaba 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.

Entonces, el requisito de que necesite al menos dos puntos en el dominio parece ser correcto, aunque no veo por qué debería serlo.

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>
xgretsch avatar May 20 '2013 14:05 xgretsch