¿Cómo resuelvo el problema de perder una sesión después de una redirección en PHP?
Recientemente, me encontré con un problema muy común de perder sesión después de la redirección. Y después de buscar en este sitio web, todavía no puedo encontrar ninguna solución (aunque esta fue la más cercana).
Actualizar
He encontrado la respuesta y pensé en publicarla aquí para ayudar a cualquiera que experimente el mismo problema.
php
session
redirect
session-cookies
shared-hosting
dayuloli
fuente
fuente
Respuestas:
Primero, realice estos controles habituales:
session_start();
se llame antes de que se llame a cualquier sesión. Por lo tanto, una apuesta segura sería colocarlo al comienzo de su página, inmediatamente después de la<?php
declaración de apertura antes que nada. Asegúrese también de que no haya espacios en blanco / pestañas antes de la<?php
declaración de apertura .header
redirección, finalice el script actual usandoexit();
(Otros también han sugeridosession_write_close();
ysession_regenerate_id(true)
, puede probarlos también, pero yo usaríaexit();
)register_globals
esté apagado, puede verificar esto en elphp.ini
archivo y también usandophpinfo()
. Consulte esto sobre cómo apagarlo.$_SESSION
matriz superglobal no se sobrescriba en ninguna partewww.yourdomain.com
ayourdomain.com
no lleva la sesión hacia adelante..php
(¡sucede!)Ahora, estos son los errores más comunes, pero si no funcionaron, es probable que el problema lo resuelva con su empresa de alojamiento. Si todo funciona
localhost
pero no en su servidor remoto / de prueba, entonces este es probablemente el culpable. Así que verifique la base de conocimientos de su proveedor de alojamiento (también pruebe sus foros, etc.). Para empresas como FatCow e iPage, requieren que especifiquesession_save_path
. Así como esto:(reemplace "su ruta de directorio de inicio" con su ruta de directorio de inicio real. Esto generalmente está dentro de su panel de control (o equivalente), pero también puede crear un
test.php
archivo en su directorio raíz y escribir:El bit anterior a 'test.php' es la ruta del directorio de inicio. Y, por supuesto, asegúrese de que la carpeta realmente exista dentro de su directorio raíz. (Algunos programas no cargan carpetas vacías cuando se sincronizan)
fuente
debe usar "salir" después de la llamada al encabezado
fuente
echo ' ';
) o espacios en blanco de cualquier tipo, ignorará por completo el encabezado de ubicación.Intenté todas las soluciones posibles, ¡pero ninguna funcionó para mí! Por supuesto, estoy usando un servicio de alojamiento compartido.
Al final, resolví el problema usando 'URL relativa' dentro del encabezado de redireccionamiento.
anula las cookies de sesión
trabajado como un encanto !
fuente
Yo tuve el mismo problema. Trabajé en él durante varias horas y me volvió loco.
En mi caso, el problema era un 404 llamado debido a la falta de favicon.ico solo en Chrome y Firefox. Los otros navegadores funcionaron bien.
fuente
Cuando uso la ruta relativa "dir / file.php" con la función header () me funciona. Creo que la sesión no se guarda por alguna razón cuando redirige utilizando la url completa ...
fuente
Esto me dejó perplejo durante mucho tiempo (¡y esta publicación fue genial de encontrar!), Pero para cualquier otra persona que todavía no pueda obtener sesiones entre redirecciones de página para trabajar ... tuve que ir al archivo php.ini y activar las cookies :
Pensé que las sesiones funcionaban sin cookies ... de hecho, sé que DEBERÍAN ... pero esto solucionó mi problema al menos hasta que puedo entender lo que puede estar sucediendo en el panorama general.
fuente
Tuve un problema similar, aunque mi contexto era ligeramente diferente. Tenía una configuración de desarrollo local en una máquina cuyo nombre de host era
windows
y la dirección IP era192.168.56.2
.Pude acceder al sistema usando cualquiera de:
Después de iniciar sesión, mi código PHP se redirigiría usando:
Si el nombre de dominio anterior utilizado para acceder al sistema no lo fuera
windows
, los datos de la sesión se perderían. Resolví esto cambiando el código a:Ahora funciona independientemente de qué nombre de dominio local o dirección IP ingrese el usuario.
Espero que esto pueda ser útil para alguien.
fuente
Me encontré con este problema en una página en particular. Estaba configurando valores de $ _SESSION en otras páginas justo antes de redirigir y todo funcionaba bien. Pero esta página en particular no estaba funcionando.
Finalmente me di cuenta de que en esta página en particular, estaba destruyendo la sesión al comienzo de la página pero nunca comencé de nuevo. Entonces mi función de destrucción cambió de:
a:
¡Y todo funcionó!
fuente
Estaba teniendo el mismo problema. De repente, ALGUNAS de mis variables de sesión no persistirían en la página siguiente. El problema resultó ser (en php7.1) que la ubicación del encabezado no debe tener WWW, por ejemplo, https: // mysite . está bien, https: //www.mysite . perderá las páginas variables de sesión. No todo, solo esa página.
fuente
www.mysite.com
es visto como un dominio completamente diferenteblog.mysite.com
o simplementemysite.com
He estado luchando con esto durante días, comprobando / probando todas las soluciones, pero mi problema fue que no volví a llamar
session_start();
después de la redirección. Simplemente asumí que la sesión estaba "todavía viva".¡Así que no lo olvides!
fuente
Tuve el mismo problema y encontré la forma más fácil. Simplemente redirigí a un .html de redireccionamiento con 1 línea de JS
en lugar de PHP
Espero que esto ayude.
Gramo de amor
fuente
Si está utilizando,
session_set_cookie_params()
es posible que desee comprobar si está pasando el cuarto parámetro$secure
comotrue
. Si es así, debe acceder a la URL usando https.El
$secure
parámetro siendo verdadero significa que la sesión solo está disponible dentro de una solicitud segura. Esto podría afectarlo localmente más que en entornos de escenario o producción.Mencionándolo porque acabo de pasar la mayor parte del día tratando de encontrar este problema, y esto es lo que lo resolvió para mí. Me acaban de agregar a este proyecto y nadie mencionó que requería https.
Por lo tanto, puede usar https localmente o puede establecer el parámetro
$secure
enFALSE
y luego usar http localmente. Solo asegúrese de volver a establecerlo en verdadero cuando empuje los cambios hacia arriba.Dependiendo de su servidor local, es posible que deba editar
DocumentRoot
enhttpd-ssl.conf
el servidor para que su URL local se sirva https.fuente
Otra posible razón:
Ese es el espacio de almacenamiento de mi servidor. El espacio en disco de mi servidor se llena. Entonces, eliminé algunos archivos y carpetas en mi servidor y lo intenté.
Fue trabajado !!!
Estoy guardando mi sesión en AWS Dynamo DB, pero todavía espera algo de espacio en mi servidor para procesar la sesión. ¡No estoy seguro de por qué!
fuente
Si está utilizando Laravel y experimenta este problema, lo que necesita es guardar los datos de su sesión antes de redirigir.
fuente
También tuve el mismo problema con el redireccionamiento que no funcionaba y probé todas las soluciones que pude encontrar, mi redireccionamiento de encabezado se estaba utilizando de una forma.
Lo resolví colocando la redirección del encabezado en una página php diferente 'signin_action.php' y pasando los parámetros de las variables a través de los parámetros que quería en url y luego reasignándolos en el formulario 'signin_action.php'.
signin.php
signin_action.php
No es una hermosa solución, pero funcionó.
fuente
Para mí, el error fue que intenté guardar un objeto no serializable en la sesión para que se produjera una excepción al intentar escribir la sesión. Pero como todo mi código de manejo de errores ya había dejado de funcionar, nunca vi el error.
Sin embargo, podría encontrarlo en los registros de errores de Apache.
fuente
Solo para el registro ... Tuve este problema y después de algunas horas de intentarlo todo, el problema era que el disco estaba lleno, y las sesiones de php no podían escribirse en el directorio tmp ... así que si tiene este problema, verifique que también...
fuente
www
), por lo que el rendimientochown -R www.www
en la carpeta de sesiones soluciona el problema.Para mí, Firefox ha almacenado el ID de sesión (PHPSESSID) en una cookie, pero Google Chrome ha utilizado el parámetro GET o POST. Por lo tanto, solo debe asegurarse de que el script que regresa (para mí: el pago de PayPal) confirme PHPSESSID en el parámetro url o POST.
fuente
Después de probar muchas soluciones aquí en SO y otros blogs ... lo que funcionó para mí fue agregar .htaccess a la raíz de mi sitio web.
fuente
Si está utilizando Wordpress, tuve que agregar este gancho e iniciar la sesión en init:
fuente
Nada funcionó para mí, pero encontré la causa del problema (y lo resolví):
Verifique las cookies de su navegador y asegúrese de que no haya cookies de sesión de php en diferentes subdominios (como una para " www.website.com " y otra para " website.com ").
Esto fue causado por un javascript que utilizaba incorrectamente el subdominio para configurar cookies y abrir páginas en iframes.
fuente
En primer lugar, asegúrese de llamar
session_start()
antes de usar$_SESSION
variable.Si ha deshabilitado el informe de errores, intente encenderlo y ver el resultado.
Las razones más comunes que no se mencionan en la respuesta de @ dayuloli:
Problema de espacio en disco. Asegúrese de que su espacio en disco no esté lleno, necesita algo de espacio para almacenar archivos de sesión.
El directorio de la sesión puede no ser editable. Puedes consultarlo con
is_writable(session_save_path())
fuente
Estaba teniendo el mismo problema y me volví loco buscando en mi código la respuesta. Finalmente encontré que mi alojamiento actualizó recientemente la versión de PHP en mi servidor y no configuré correctamente el
session_save_path
parámetro en elphp.ini
archivo.Entonces, si alguien lee esto, verifique la
php.ini
configuración antes que nada.fuente
Asegúrese de que
session_write_close
no se llame entresession_start()
y cuando configure su sesión.fuente
Ahora que GDPR es una cosa, las personas que visitan esta pregunta probablemente usan un script de cookies. Bueno, ese guión me causó el problema. Aparentemente, PHP usa una cookie llamada
PHPSESSID
para rastrear la sesión. Si ese script lo elimina, pierde sus datos.He utilizado este script de galletas . Tiene una opción para habilitar las cookies "esenciales". Agregué
PHPSESSID
a la lista, el script dejó de eliminar la cookie y todo comenzó a funcionar nuevamente.Probablemente podría habilitar alguna configuración de PHP para evitar usar
PHPSESSID
, pero si la secuencia de comandos de cookies es la causa del problema, por qué no fijar que .fuente
Solucioné este problema después de muchos días de depuración y todo fue porque mi URL de retorno proveniente de PayPal Express Checkout no tenía un 'www'. Chrome reconoció que los dominios deberían ser tratados de la misma manera, pero otros navegadores a veces no. Cuando use sesiones / cookies y rutas absolutas, ¡no olvide el 'www'!
fuente
Lo solucioné dando permisos de escritura grupales a la ruta donde PHP almacena los archivos de sesión. Puede encontrar la ruta de la sesión con la función session_save_path ().
fuente
Hoy tuve este problema en un proyecto y tuve que cambiar este parámetro a falso (o eliminar las líneas, por defecto está deshabilitado):
Esto sucedió porque el proyecto real funciona sobre http y no solo https. Encontré más información en los documentos http://php.net/manual/en/session.security.ini.php
fuente
Demasiado tarde para responder pero esto funcionó para mí
fuente
Para mí esto fue un error de permiso y esto lo resolvió:
He probado algunas horas en PHP y la última prueba que hice fue que creé dos archivos session1.php y session2.php.
session1.php:
session2.php:
e imprimía una matriz vacía.
En este punto, pensé que podría ser un problema del servidor y, de hecho, lo era.
Espero que esto ayude a alguien.
fuente