Devo estar sentindo falta de algo básico sobre cookies. No localhost, quando defino um cookie no servidor e especifique o domínio explicitamente como localhost (ou .localhost). o cookie não parece ser aceito por alguns navegadores.
Firefox 3.5: verifiquei a solicitação HTTP no Firebug. O que eu vejo é:
Set-Cookie:
name=value;
domain=localhost;
expires=Thu, 16-Jul-2009 21:25:05 GMT;
path=/
ou (quando defino o domínio como .localhost):
Set-Cookie:
name=value;
domain=.localhost;
expires=Thu, 16-Jul-2009 21:25:05 GMT;
path=/
Nos dois casos, o cookie não é armazenado.
IE8: Eu não usei nenhuma ferramenta extra, mas o cookie não parece ser armazenado também, porque não está sendo enviado de volta em solicitações subsequentes.
Opera 9.64: Localhost e .localhost funcionam , mas quando eu checo a lista de cookies nas Preferências, o domínio é definido como localhost.local, mesmo listado em localhost (no agrupamento de listas).
Safari 4: localhost e .localhost funcionam , mas sempre são listados como .localhost nas Preferências. Por outro lado, um cookie sem um domínio explícito, sendo mostrado apenas como localhost (sem ponto).
Qual é o problema com o localhost? Devido a esse número de inconsistências, deve haver algumas regras especiais envolvendo o host local. Além disso, não está completamente claro para mim por que os domínios devem ser prefixados por um ponto? A RFC 2109 afirma explicitamente que:
O valor para o atributo Domínio não contém pontos incorporados ou não começa com um ponto.
Por quê? O documento indica que precisa fazer algo com segurança. Devo admitir que não li toda a especificação (pode fazê-lo mais tarde), mas parece um pouco estranho. Com base nisso, seria impossível definir cookies no host local.
Respostas:
Por design, os nomes de domínio devem ter pelo menos dois pontos; caso contrário, o navegador as considerará inválidas. (Consulte a referência em http://curl.haxx.se/rfc/cookie_spec.html )
Ao trabalhar
localhost
, o domínio do cookie deve ser totalmente omitido. Apenas definindo-o como""
ouNULL
ouFALSE
em vez de"localhost"
não é suficiente.Para PHP, consulte os comentários em http://php.net/manual/en/function.setcookie.php#73107 .
Se estiver trabalhando com a API Java Servlet, não chame o
cookie.setDomain("...")
método.fonte
Domain=
parâmetro ao configurar o cookie. Se você acabou de definir o domínio como nulo ou vazio, talvez sua estrutura envie oDomain=
parâmetro com esse valor, em vez de omiti-lo? Verifique com, por exemplo, o Firebug.((domain && domain !== "localhost") ? ";domain="+domain : "")
Concordo amplamente com o @Ralph Buchfelder, mas aqui está uma amplificação disso, ao tentar replicar um sistema com vários subdomínios (como example.com, fr.example.com, de.example.com) na minha máquina local ( OS X / Apache / Chrome | Firefox).
Eu editei o / etc / hosts para apontar alguns subdomínios imaginários para 127.0.0.1:
Se estou trabalhando em fr.localexample.com e deixo o parâmetro domain fora, o cookie é armazenado corretamente em fr.localexample.com, mas não é visível nos outros subdomínios.
Se eu usar um domínio de ".localexample.com", o cookie é armazenado corretamente para fr.localexample.com, e é visível em outros subdomínios.
Se eu usar um domínio "localexample.com" ou quando estiver tentando um domínio apenas "localexample" ou "localhost", o cookie não será armazenado.
Se eu usar um domínio "fr.localexample.com" ou ".fr.localexample.com", o cookie será armazenado corretamente em fr.localexample.com e será (corretamente) invisível em outros subdomínios.
Portanto, o requisito de que você precisa de pelo menos dois pontos no domínio parece estar correto, mesmo que eu não possa ver por que deveria ser.
Se alguém quiser tentar isso, aqui está um código útil:
fonte
localhost: você pode usar:
domain: ".app.localhost"
e funcionará. O parâmetro 'domínio' precisa de 1 ou mais pontos no nome do domínio para definir cookies. Então você pode ter sessões de trabalho em subdomínios localhost tais como:api.app.localhost:3000
.fonte
express.session({cookie: { domain: '.app.localhost', maxAge: 24 * 60 * 60 * 1000 }})
.app.
? Faz parte de algum SPEC? E é aplicável a todos os domínios não conformes (aqueles sem dois pontos)? Além disso, isso funcionará com navegadores antigos? : ^)Quando um cookie é definido com um domínio explícito de 'localhost', da seguinte maneira ...
... os navegadores o ignoram porque ele não inclui pelo menos dois períodos e não é um dos sete domínios de nível superior manipulados especialmente .
Observe que o número de períodos acima provavelmente supõe que um período inicial seja necessário. No entanto, esse período é ignorado nos navegadores modernos e provavelmente deve ser ...
Observe que o valor padrão para o atributo domain é o nome do host do servidor que gerou a resposta do cookie .
Portanto, uma solução alternativa para os cookies que não estão sendo definidos para o host local é simplesmente não especificar um atributo de domínio e deixar o navegador usar o valor padrão - isso não parece ter as mesmas restrições que um valor explícito no atributo de domínio.
fonte
Resultados que eu variava de acordo com o navegador.
O Chrome 127.0.0.1 funcionou, mas localhost .localhost e "" não. Firefox- .localhost funcionou, mas localhost, 127.0.0.1 e "" não.
Não testou no Opera, IE ou Safari
fonte
Domain=
parâmetro funciona.Domain=
também funciona, masDomain=localhost
não funciona.Passei muito tempo solucionando esse problema sozinho.
Usando PHP, e Nada nesta página funcionou para mim. Acabei percebendo no meu código que o parâmetro 'secure' para session_set_cookie_params () do PHP estava sempre sendo definido como TRUE.
Como eu não estava visitando o host local com https, meu navegador nunca aceitaria o cookie. Portanto, modifiquei essa parte do meu código para definir condicionalmente o parâmetro 'secure' com base em $ _SERVER ['HTTP_HOST'] sendo 'localhost' ou não. Trabalhando bem agora.
Espero que isso ajude alguém.
fonte
Se você estiver configurando um cookie de outro domínio (ou seja, você definiu o cookie fazendo uma solicitação de origem cruzada XHR), precisa ter certeza de definir o
withCredentials
atributo como true no XMLHttpRequest usado para buscar o cookie, conforme descrito aquifonte
você pode usar
localhost.org
ou melhor,.localhost.org
ele sempre resolverá127.0.0.1
fonte
Tive sorte muito melhor testando localmente usando 127.0.0.1 como domínio. Não sei por que, mas tive resultados mistos com localhost e .localhost etc.
fonte
Nenhuma das correções sugeridas funcionou para mim - definindo como nulo, falso, adicionando dois pontos etc. - não funcionou.
No final, acabei de remover o domínio do cookie, se for localhost e que agora funciona para mim no Chrome 38 .
Código anterior (não funcionou):
Novo código (agora funcionando):
fonte
Eu tive o mesmo problema e o corrigi colocando 2 pontos no nome do cookie, sem especificar nenhum domínio.
fonte
Parece haver um problema quando você usa
https://<local-domain>
e depoishttp://<local-domain>
. Ohttp://
site não envia cookies com solicitações depois que ohttps://
site os define. Forçar o recarregamento e limpar o cache não ajuda. Somente a limpeza manual de cookies funciona. Além disso, se eu limpá-los nahttps://
página, ahttp://
página começará a funcionar novamente.Parece estar relacionado a "Cookies seguros estritos". Boa explicação aqui . Foi lançado no Chrome 58 em 19/04/2017.
Parece que o Chrome de fato registra cookies seguros e não seguros, pois mostrará os cookies corretos dependendo do protocolo da página ao clicar no ícone da barra de endereço.
Mas
Developer tools > Application > Cookies
não mostrará um cookie não seguro quando houver um cookie seguro com o mesmo nome para o mesmo domínio, nem enviará o cookie não seguro com quaisquer solicitações. Parece um bug do Chrome ou, se esse comportamento for esperado, deve haver alguma maneira de exibir os cookies seguros quando em umahttp
página e uma indicação de que eles estão sendo substituídos.A solução alternativa é usar cookies nomeados diferentes, dependendo se eles são para um site http ou site https, e nomeá-los específicos para seu aplicativo. Um
__Secure-
prefixo indica que o cookie deve ser estritamente seguro e também é uma boa prática, porque o seguro e o não seguro não colidem. Existem outros benefícios para prefixos também.O uso de
/etc/hosts
domínios diferentes para acesso https vs. http também funcionaria, mas umahttps://localhost
visita acidental impedirá que cookies com os mesmos nomes funcionem noshttp://localhost
sites - portanto, essa não é uma boa solução alternativa.Arquivei um relatório de bug do Chrome .
fonte
document.cookie = nome do valor + "=" + valor + ";" + expira + "; domínio =; caminho = /";
este "domínio =; caminho = /"; assumirá um domínio dinâmico, pois seu cookie funcionará no subdomínio. se você quiser testar no localhost ele funcionará
fonte
Nenhuma das respostas aqui funcionou para mim. Corrigi-o colocando meu PHP como a primeira coisa na página.
Como outros cabeçalhos, os cookies devem ser enviados antes de qualquer saída do seu script (esta é uma restrição de protocolo). Isso requer que você faça chamadas para essa função antes de qualquer saída, incluindo as tags e, além de qualquer espaço em branco.
Em http://php.net/manual/en/function.setcookie.php
fonte
Há um problema no Chromium aberto desde 2011 : se você estiver definindo explicitamente o domínio como 'localhost', defina-o como
false
ouundefined
.fonte
Eu estava brincando um pouco.
funciona no Firefox e Chrome a partir de hoje. No entanto, não encontrei uma maneira de fazê-lo funcionar com curl. Tentei Host-Header e --resolve, sem sorte, qualquer ajuda apreciada.
No entanto, ele funciona em curl, se eu definir como
em vez de. (O que não funciona com o Firefox.)
fonte
Outro detalhe importante, expira = deve usar o seguinte formato de data e hora: Wdy, DD-Mon-AAAA HH: MM: SS GMT ( RFC6265 - Seção 4.1.1 ).
fonte
Após muita experimentação e leitura de vários posts, isso funcionou. Eu poderia definir vários cookies, lê-los novamente e definir o tempo negativo e excluí-los.
fonte
A única coisa que funcionou para mim foi definir
Path=/
o biscoito.Além disso, o valor padrão de um atributo de caminho parece ser diferente de navegadores para navegadores, embora eu tenha testado apenas dois deles (Firefox e Chrome).
O Chrome tenta definir um cookie como está; se o
path
atributo for omitido noSet-Cookie
cabeçalho, ele não será armazenado e ignorado.No entanto, o Firefox armazena um cookie mesmo sem um
path
atributo explícito . É só configurá-lo com o caminho solicitado; meu URL de solicitação era/api/v1/users
e o caminho era definido/api/v1
automaticamente.De qualquer forma, os dois navegadores funcionavam quando
path
era definido como/
mesmo sem um domínio explícito,Domain=localhost
ou seja, algo assim. Portanto, existem algumas diferenças na maneira como cada navegador lida com cookies.fonte