Como resolver o problema de perder uma sessão após um redirecionamento em PHP?
Recentemente, encontrei um problema muito comum de perder a sessão após o redirecionamento. E depois de pesquisar neste site, ainda não encontro uma solução (embora isso tenha chegado mais perto).
Atualizar
Encontrei a resposta e pensei em publicá-la aqui para ajudar qualquer pessoa com o mesmo problema.
php
session
redirect
session-cookies
shared-hosting
dayuloli
fonte
fonte
Respostas:
Primeiro, execute as verificações habituais:
session_start();
é chamado antes de qualquer sessão ser chamada. Portanto, uma aposta segura seria colocá-lo no início da sua página, imediatamente após a<?php
declaração de abertura antes de qualquer outra coisa. Verifique também se não há espaços em branco / guias antes da<?php
declaração de abertura .header
redirecionamento, finalize o script atual usandoexit();
(Outros também sugeriramsession_write_close();
esession_regenerate_id(true)
, você pode experimentá-los também, mas eu usariaexit();
)register_globals
está desativado, você pode verificar isso nophp.ini
arquivo e também usá-lophpinfo()
. Consulte isso para saber como desativá-lo.$_SESSION
matriz superglobal não seja substituída em nenhum lugarwww.yourdomain.com
parayourdomain.com
não leva a sessão adiante..php
(acontece!)Agora, esses são os erros mais comuns, mas se eles não resolverem o problema, é mais provável que o problema esteja relacionado à sua empresa de hospedagem. Se tudo funcionar,
localhost
mas não no seu servidor remoto / de teste, provavelmente é o culpado. Portanto, verifique a base de conhecimento do seu provedor de hospedagem (tente também seus fóruns, etc.) Para empresas como FatCow e iPage, elas exigem que você especifiquesession_save_path
. Então assim:(substitua "o caminho do diretório inicial" pelo caminho real do diretório inicial. Isso geralmente ocorre no painel de controle (ou equivalente), mas você também pode criar um
test.php
arquivo no diretório raiz e digitar:O bit anterior a 'test.php' é o caminho do diretório inicial. E, claro, verifique se a pasta realmente existe dentro do diretório raiz. (Alguns programas não carregam pastas vazias ao sincronizar)
fonte
você deve usar "exit" após a chamada de cabeçalho
fonte
echo ' ';
) ou espaço em branco de qualquer tipo, ele ignorará completamente o cabeçalho do local.Eu tentei todas as soluções possíveis, mas nenhuma funcionou para mim! Claro, estou usando um serviço de hospedagem compartilhada.
No final, resolvi o problema usando 'url relativo' dentro do cabeçalho de redirecionamento!
anulou os cookies da sessão
funcionou como um encanto!
fonte
Eu tive o mesmo problema. Eu trabalhei nele por várias horas e isso me deixou louco.
No meu caso, o problema foi chamado 404 devido a um favicon.ico ausente apenas no Chrome e Firefox. Os outros navegadores funcionaram bem.
fonte
Quando eu uso o caminho relativo "dir / file.php" com a função header () no funciona para mim. Eu acho que a sessão não é salva por algum motivo quando você redireciona usando o URL completo ...
fonte
Isso me deixou perplexo por um longo tempo (e essa postagem foi ótima de encontrar!), Mas para quem ainda não consegue obter sessões entre redirecionamentos de página para funcionar ... eu tive que entrar no arquivo php.ini e ativar os cookies :
Eu pensei que as sessões funcionavam sem cookies ... na verdade, eu sei que elas deveriam ... mas isso resolveu meu problema pelo menos até que eu possa entender o que pode estar acontecendo no cenário geral.
fonte
Eu tive um problema semelhante, embora meu contexto fosse um pouco diferente. Eu tinha uma configuração de desenvolvimento local em uma máquina cujo nome do host
windows
e endereço IP eram192.168.56.2
.Eu poderia acessar o sistema usando um dos seguintes:
Após o login, meu código PHP seria redirecionado usando:
Se o nome de domínio anterior usado para acessar o sistema não fosse
windows
, os dados da sessão seriam perdidos. Resolvi isso alterando o código para:Agora ele funciona independentemente do nome de domínio local ou endereço IP que o usuário coloca.
Espero que isso possa ser útil para alguém.
fonte
Eu encontrei esse problema em uma página específica. Eu estava definindo os valores $ _SESSION em outras páginas antes de redirecionar e tudo estava funcionando bem. Mas esta página em particular não estava funcionando.
Finalmente, percebi que, nesta página em particular, estava destruindo a sessão no início da página, mas nunca a iniciando novamente. Então, minha função de destruição mudou de:
para:
E tudo funcionou!
fonte
Eu estava tendo o mesmo problema. De repente, ALGUMAS das minhas variáveis de sessão não persistiram na página seguinte. O problema acabou sendo (no php7.1) o local do cabeçalho não deve ter WWW, ex https: // mysite . está ok, https: //www.mysite . perderá as variáveis de sessão dessas páginas. Nem todas, apenas essa página.
fonte
www.mysite.com
é visto como um domínio completamente diferente do queblog.mysite.com
ou simplesmentemysite.com
Estou lutando com isso há dias, verificando / tentando todas as soluções, mas meu problema era que não liguei
session_start();
novamente após o redirecionamento. Apenas assumi que a sessão ainda estava "viva".Então não esqueça disso!
fonte
Eu tive o mesmo problema e encontrei o caminho mais fácil. Eu simplesmente redirecionei para um redirecionamento .html com 1 linha de JS
em vez de PHP
Eu espero que isso ajude.
Love Gram
fonte
Se você estiver usando,
session_set_cookie_params()
talvez queira verificar se está passando o quarto parâmetro$secure
comotrue
. Se estiver, é necessário acessar o URL usando https.O
$secure
parâmetro sendo verdadeiro significa que a sessão está disponível apenas dentro de uma solicitação segura. Isso pode afetar você localmente mais do que nos ambientes de palco ou produção.Mencionei isso porque passei a maior parte do dia tentando encontrar esse problema, e foi isso que resolveu para mim. Acabei de ser adicionado a este projeto e ninguém mencionou que era necessário https.
Portanto, você pode usar https localmente ou pode definir o
$secure
parâmetro comoFALSE
e usar http localmente. Apenas certifique-se de configurá-lo novamente para verdadeiro quando você fizer suas alterações.Dependendo do seu servidor local, você pode ter que editar
DocumentRoot
nahttpd-ssl.conf
do servidor para que o seu url local é servida https.fonte
Outro motivo possível:
Esse é o meu espaço de armazenamento do servidor. O espaço em disco do meu servidor fica cheio. Então, removi alguns arquivos e pastas do meu servidor e tentei.
Foi trabalhado !!!
Estou salvando minha sessão no AWS Dynamo DB, mas ele ainda espera algum espaço no meu servidor para processar a sessão. Não sei por que !!!
fonte
Se você estiver usando o Laravel e tiver esse problema, será necessário salvar os dados da sessão antes de redirecionar.
fonte
Eu também tive o mesmo problema com o redirecionamento não funcionando e tentei todas as soluções que encontrei, meu redirecionamento de cabeçalho estava sendo usado em um formulário.
Eu o resolvi colocando o redirecionamento de cabeçalho em uma página php diferente 'signin_action.php' e passando os parâmetros das variáveis através dos parâmetros desejados nos URLs e reatribuindo-os no formulário 'signin_action.php'.
signin.php
signin_action.php
Não é uma solução alternativa bonita, mas funcionou.
fonte
Para mim, o erro foi que tentei salvar um objeto não serializável na sessão para que uma exceção fosse lançada ao tentar gravar a sessão. Mas como todo o meu código de manipulação de erros já havia cessado qualquer operação, nunca vi o erro.
Eu poderia encontrá-lo nos logs de erro do Apache, no entanto.
fonte
Só para constar ... Eu tive esse problema e, depois de algumas horas tentando tudo, o problema era que o disco estava cheio e as sessões php não puderam ser gravadas no diretório tmp ... então, se você tiver esse problema, verifique se também...
fonte
www
), portanto, o desempenhochown -R www.www
na pasta de sessões corrige o problema.Para mim, o Firefox armazenou o ID da sessão (PHPSESSID) em um cookie, mas o Google Chrome usou o parâmetro GET ou POST. Portanto, você só precisa garantir que o script de retorno (para mim: paypal checkout) confirme PHPSESSID no parâmetro url ou POST.
fonte
Depois de tentar muitas soluções aqui no SO e em outros blogs ... o que funcionou para mim foi adicionar .htaccess à raiz do meu site.
fonte
Se você estiver usando o Wordpress, tive que adicionar este gancho e iniciar a sessão no init:
fonte
Nada funcionou para mim, mas descobri o que causou o problema (e o resolvi):
Verifique os cookies do navegador e verifique se não há cookies de sessão php em subdomínios diferentes (como um para " www.website.com " e outro para " website.com ").
Isso foi causado por um javascript que usou incorretamente o subdomínio para definir cookies e abrir páginas em iframes.
fonte
Primeiro, verifique se você está chamando
session_start()
antes de usar a$_SESSION
variável.Se você desativou o relatório de erros, tente ativar e ver o resultado.
Os motivos mais comuns que não são mencionados na resposta do @ dayuloli:
Problema de espaço em disco. Verifique se o espaço em disco não está cheio. Você precisa de espaço para armazenar arquivos de sessão.
O diretório da sessão pode não ser gravável. Você pode verificá-lo com
is_writable(session_save_path())
fonte
Eu estava tendo o mesmo problema e fiquei louca procurando a resposta no meu código. Finalmente, achei minha hospedagem recentemente atualizada a versão PHP no meu servidor e não configurei corretamente o
session_save_path
parâmetro nophp.ini
arquivo.Portanto, se alguém ler isso, verifique a
php.ini
configuração antes de qualquer outra coisa.fonte
Verifique se
session_write_close
não é chamado entresession_start()
e quando você define sua sessão.fonte
Agora que o GDPR é uma coisa, as pessoas que visitam essa pergunta provavelmente usam um script de cookie. Bem, esse script causou o problema para mim. Aparentemente, o PHP usa um cookie chamado
PHPSESSID
para rastrear a sessão. Se esse script o excluir, você perderá seus dados.Eu usei esse script de cookie . Tem uma opção para ativar cookies "essenciais". Eu adicionei
PHPSESSID
à lista, o script parou de excluir o cookie e tudo começou a funcionar novamente.Você provavelmente poderia habilitar algumas configurações do PHP para evitar o uso
PHPSESSID
, mas se o seu script de cookie for a causa do problema, por que não corrigi- lo ?fonte
Corrigi esse problema após vários dias de depuração e era tudo porque meu URL de retorno do PayPal Express Checkout não tinha um 'www'. O Chrome reconheceu que os domínios deveriam ser tratados da mesma forma, mas outros navegadores às vezes não. Ao usar sessões / cookies e caminhos absolutos, não esqueça o 'www'!
fonte
Eu consertei, dando permissões de gravação em grupo para o caminho em que o PHP armazena arquivos de sessão. Você pode encontrar o caminho da sessão com a função session_save_path ().
fonte
Hoje eu tive esse problema em um projeto e tive que alterar esse parâmetro para false (ou remover as linhas, por padrão, está desabilitado):
Isso aconteceu porque o projeto real funciona sobre http e não apenas https. Encontrei mais informações nos documentos http://php.net/manual/en/session.security.ini.php
fonte
Tarde demais para responder, mas isso funcionou para mim
fonte
Para mim, isso foi um erro de permissão e isso resolveu:
Testei algumas horas em PHP e o último teste que fiz foi criar dois arquivos session1.php e session2.php.
session1.php:
session2.php:
e estava imprimindo uma matriz vazia.
Neste ponto, eu pensei que poderia ser um problema de servidor e, de fato, era.
Espero que isso ajude alguém.
fonte