Estou tentando configurar o seguinte:
auth.example.com
sub1.example.com
sub2.example.com
Se o usuário visitar sub1.example.com
ou sub2.example.com
e não estiver conectado, ele será redirecionado para auth.example.com
e poderá fazer o login.
sub1.example.com
e sub2.example.com
são dois aplicativos separados, mas usam as mesmas credenciais.
Tentei definir o seguinte no meu php.ini:
session.cookie_domain = ".example.com"
mas não parece estar passando as informações de um domínio para outro.
[Editar]
Tentei o seguinte:
sub1.example.com/test.php
session_set_cookie_params(0, '/', '.example.com');
session_start();
print session_id() . "<br>";
$_SESSION['Regsitered'] = 1;
echo '<a href="http://auth.example.com/test.php">Change Sites</a>'
auth.example.com/test.php
session_set_cookie_params(0, '/', '.example.com');
session_start();
print session_id() . "<br>";
$_SESSION['Checked'] = 1;
print_r($_SESSION);
Os IDs de sessão são exatamente os mesmos, mas quando eu despejo a $_SESSION
variável, ela não mostra as duas chaves, apenas qualquer chave que configurei em cada domínio.
php
authentication
session
cross-domain
dragonmantank
fonte
fonte
Respostas:
Não sei se o problema ainda existe, mas acabei de encontrar o mesmo problema e resolvi definindo um nome de sessão antes de ligar
session_set_cookie_params()
:Não mudei nada no meu,
php.ini
mas agora tudo está funcionando bem.fonte
$some_name = session_name("some_name");
que fez isso. Obrigado e voto positivo.session_name("domain");
era o ingrediente que faltava para mim também. A documentação no php.net sobre essas configurações de sessão está faltando. Existem postagens da comunidade em php.net que indicam que session.name precisa ser definido antes que as mudanças em session_set_cookie_params () possam ser aplicadas.ini_set("session.cookie_domain", ".domain.com");
causa que estava causando a criação de um novo id de sessão a cada atualização.Uma coisa que pode impedir misteriosamente que os dados da sessão sejam lidos em um subdomínio, apesar dos cookies estarem configurados corretamente,
.example.com
é o patch Suhosin do PHP. Você pode ter tudo configurado corretamente, conforme os exemplos da pergunta, e pode simplesmente não funcionar.Desative as seguintes configurações de sessão do Suhosin e você estará de volta aos negócios:
fonte
Tente usar:
Ao invés de:
Observe o período ausente no início.
No entanto, tenha cuidado ao usar isso, porque não é compatível com todos os navegadores.
fonte
Tive exatamente este problema - eu queria que os valores de sessão criados em x.example.local estivessem disponíveis em example.local e vice-versa.
Todas as soluções que encontrei diziam para alterar o domínio da Sessão usando
php_value session.cookie_domain .example.local
.htaccess (ou via php.ini ou via ini_set).O problema é que eu estava configurando
session.cookie_domain
para todos os subdomínios (até agora ok), mas também para o domínio principal. Definir osession.cookie_domain
no domínio principal é aparentemente um não-não.Basicamente, a forma como funcionou para mim:
session.cookie_domain
para TODOS OS SUBDOMÍNIOS.Sim, certifique-se de que o domínio tem um TLD (no meu caso .local). O protocolo Http não permite que cookies / sessões sejam armazenados em um domínio sem .tld (ou seja, localhost não funcionará, mas stuff.localhost sim).
EDITAR : Certifique-se também de sempre limpar os cookies do navegador ao testar / depurar sessões em subdomínios. Caso contrário, seu navegador sempre enviará o cookie de sessão antigo, que provavelmente ainda não possui o cookie_domain correto definido. O servidor irá reviver a sessão antiga e, portanto, você obterá resultados falsos negativos. (em muitos posts é mencionado o uso de session_name ('stuff') para o mesmo efeito)
fonte
Eu resolvi assim
Porque eu estava trabalhando no localhost
não estava funcionando , ele vê .localhost como o nível superior em vez de .com / .local / ... (suspeito)
fonte
Eu confirmei. a resposta de joreon está correta. Não posso comentar porque minha reputação não é suficiente, então posto meu comentário aqui.
Defina a constante em um arquivo de configuração. Se você quiser alterá-lo, não há necessidade de modificar arquivos inteiros.
O nome da sessão não pode conter apenas dígitos, pelo menos uma letra deve estar presente. Caso contrário, um novo id de sessão é gerado a cada vez.
Use o seguinte código para começar a usar a sessão
Estou usando esta função:
fonte
Use-o em cada domínio / subdomínio:
O caminho para
session.save_path
pode ser diferente para o seu caso, mas deve ser o mesmo em todos os domínios / subdomínios. Nem sempre é verdade por padrão.fonte
Use isto, funciona:
fonte
Uso combinado de sessões de cookies de subdomínio e domínio raiz
Recurso: http://php.net//manual/tr/function.session-set-cookie-params.php
Eu testei trabalhos
- Códigos
fonte
Acho que você não quer algo como OpenID, como Joel está sugerindo, mas quer ter acesso aos dados da sessão em vários domínios.
A única possibilidade que posso pensar como solução para esse problema é armazenar os dados da sessão em um banco de dados e retirá-los desse banco de dados.
fonte
Tive um problema semelhante, porém, esta solução foi boa para mim, talvez ajude outras pessoas no futuro
edite o php.ini
a magia está aqui
https://www.sitepoint.com/community/t/sessions-across-subdomains-domain-com-phpsessid-changes/3013/19
fonte
Não posso falar por outras versões do PHP, mas em 5.6.6, simplesmente definir o
session.cookie_domain
valor nophp.ini
arquivo fez o truque para permitir que todos os meus subdomínios no iPage compartilhassem o mesmo conjunto de variáveis de sessão.Certifique-se de remover todos os cookies existentes relacionados ao seu domínio de seu navegador para teste.
Oh, não sei se faz alguma diferença, mas também estou usando o início automático de sessão.
fonte
Simplesmente tente usar o seguinte código logo acima do
session_start()
métodofonte
Eu li todas as respostas acima, acho que minha resposta é útil para as pessoas que procuram isso no Google:
certifique-se de que os navegadores enviem o cookie da sessão de volta aos servidores (de domínio e subdomínios), defina o domínio do cookie da sessão como
.example.com
.Certifique-se de que o PHP encontre o "destino" correto para restaurar a variável de sessão:
session_save_path
é o mesmo para todos (eu testei)session_set_save_handler
para fazer isso.fonte
Eu sei que isso é antigo, mas funciona bem para mim com vários domínios e subdomínios na mesma caixa.
?>
fonte
Usar :
fonte
Uma solução rápida e suja é usar isso para o seu redirecionamento:
isso adicionará algo ao longo das linhas de
?PHPSESSID=etnm7kbuf5lg0r6tv7je6ehtn4
ao URL, que informa ao PHP a id de sessão que deve usar.fonte