Sesión PHP perdida después de redirigir

132

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

dayuloli
fuente
1
La pregunta es cómo resolver el problema de perder una sesión después de una redirección en PHP. Ya descubrí la respuesta, solo la publiqué aquí para que otras personas lo supieran. Porque mi solución no está en StackOverflow.
dayuloli
2
Eso está bien, pero este es un sitio de control de calidad. Por favor haga su pregunta una pregunta.
jeremy
No me di cuenta de que era de ti. Aún así, este sitio es para preguntas, no para respuestas a preguntas que ya conoce.
Aris
21
@Aris Eso no es cierto, cuando las personas tienen una pregunta sobre la codificación, acuden a StackOverflow en busca de ayuda. Si no hay respuestas disponibles, entonces no pueden obtener la ayuda que necesitan. Estoy tratando de dar esa respuesta.
dayuloli

Respuestas:

208

Primero, realice estos controles habituales:

  1. Asegúrese de que 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 <?phpdeclaración de apertura antes que nada. Asegúrese también de que no haya espacios en blanco / pestañas antes de la <?phpdeclaración de apertura .
  2. Después de la headerredirección, finalice el script actual usando exit();(Otros también han sugerido session_write_close();y session_regenerate_id(true), puede probarlos también, pero yo usaría exit();)
  3. Asegúrese de que las cookies estén habilitadas en el navegador que está utilizando para probarlo.
  4. Asegúrese de que register_globalsesté apagado, puede verificar esto en el php.iniarchivo y también usando phpinfo(). Consulte esto sobre cómo apagarlo.
  5. Asegúrese de no eliminar o vaciar la sesión
  6. Asegúrese de que la clave en su $_SESSIONmatriz superglobal no se sobrescriba en ninguna parte
  7. Asegúrese de redirigir al mismo dominio. Entonces, la redirección de un www.yourdomain.coma yourdomain.comno lleva la sesión hacia adelante.
  8. Asegúrese de que su extensión de archivo sea .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 localhostpero 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 especifique session_save_path. Así como esto:

session_save_path('"your home directory path"/cgi-bin/tmp');
session_start();

(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.phparchivo en su directorio raíz y escribir:

<?php echo $_SERVER['SCRIPT_FILENAME']; ?>

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)

dayuloli
fuente
8
Muy bien escrito +1, si todo falla, solo use cookies (genere aleatoriamente una cadena y almacénela en la base de datos y úsela como su valor de cookie).
Dave Chen
2
cambiar entre http yn https también podría ser un problema stackoverflow.com/questions/441496/…
dev.e.loper
44
Tenga en cuenta que a partir de php 5.4.0 register_globals se ha eliminado, por lo que ya no causará un problema
anthonygore
2
Verifique también el registro de errores del servidor web; en mi caso, hubo un error "Error al escribir los datos de la sesión (archivos). Verifique que la configuración actual de session.save_path sea correcta". Los permisos eran incorrectos en el directorio save_path.
timbonicus
¿Alguna razón por la cual mis sesiones se almacenarían en otro lugar que no sea session.save_path?
Justin
26

debe usar "salir" después de la llamada al encabezado

header('Location: http://www.example.com/?blabla=blubb');
exit;
KraftART Berlin
fuente
Hay un error para Gecko (por ejemplo, Waterfox, Firefox, SeaMonkey) donde si hay alguna salida de datos (por ejemplo echo ' ';) o espacios en blanco de cualquier tipo, ignorará por completo el encabezado de ubicación.
John
18

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.

header("location: http://example.com/index.php")

anula las cookies de sesión

header("location: index.php")

trabajado como un encanto !

Ali al-juanidi
fuente
7

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.

Jeremie
fuente
Solo quería agradecerle esta respuesta, me di cuenta de que Varnish enviaba 404 solicitudes de imágenes a PHP sin cookies y, por lo tanto, se creaban nuevas sesiones constantemente. Puede que nunca lo hayas descubierto sin ti.
Pascal Zajac
Tuve el mismo problema, mi favicon.ico estaba siendo redirigido (redirección 302 desde el subdominio al dominio principal) y, por lo tanto, generaba una nueva sesión cada vez. ¡Muchas gracias!
simdrouin
4

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

//Does retain the session info for some reason
header("Location: dir");

//Does not retain the session for some reason
header("Location: https://mywebz.com/dir")
usuario2999967
fuente
3

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 :

session.use_cookies = 1 

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.

escandaloso
fuente
¡No sabía que las sesiones pueden funcionar sin cookies! ¡Aprenda algo nuevo cada día! programmerinterview.com/index.php/php-questions/…
dayuloli
por supuesto, PUEDEN funcionar sin cookies depende de su configuración. Pero debes saber lo que haces. Y tenga una buena razón para hacerlo. Porque es menos seguro. y en caso de que tenga que trabajar por cualquier razón sin cookies. Al menos debe configurar ini_set ('session.use_strict_mode', '1'); y generalmente tienen un tiempo de sesión corto y después del inicio de sesión del usuario, use session_regenerate_id (). Pero tenga en cuenta que si algún usuario publica un enlace a un sitio en su servidor en un foro, las personas que realmente hacen clic en este enlace se harán cargo de la sesión. Quizás verificar la ip también sea una buena idea.
Michael
3

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 windowsy la dirección IP era 192.168.56.2.

Pude acceder al sistema usando cualquiera de:

Después de iniciar sesión, mi código PHP se redirigiría usando:

header('http://windows/');

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:

header('http://'.$_SERVER['HTTP_HOST'].'/');

Ahora funciona independientemente de qué nombre de dominio local o dirección IP ingrese el usuario.

Espero que esto pueda ser útil para alguien.

Stephen K. Karanja
fuente
3

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:

function sessionKill(){

    session_destroy();

}

a:

function sessionKill(){

    session_destroy();
    session_start();

}

¡Y todo funcionó!

NicB
fuente
3

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.

Wynn
fuente
Eso es porque www.mysite.comes visto como un dominio completamente diferente blog.mysite.como simplementemysite.com
dayuloli
2

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!

Jeffrey Roosendaal
fuente
¡Si! Este fue mi problema también. Pensé que comenzar una sesión PHP era como encender una luz para toda la casa. No me di cuenta de que tienes que activar el interruptor para cada habitación que ingresas.
Dale Thompson
1

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

<!DOCTYPE html>
<html>
<script type="text/javascript">
<!--
window.location = "admin_index.php";
//–>
</script>
</html>

en lugar de PHP

header_remove();
header('Location: admin_login.php');
die;

Espero que esto ayude.

Gramo de amor

Gramrock
fuente
1

Si está utilizando, session_set_cookie_params()es posible que desee comprobar si está pasando el cuarto parámetro $securecomo true. Si es así, debe acceder a la URL usando https.

El $securepará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 $secureen FALSEy 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 DocumentRooten httpd-ssl.confel servidor para que su URL local se sirva https.

Andy Huggins
fuente
1

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é!

Jayaprakash
fuente
1

Si está utilizando Laravel y experimenta este problema, lo que necesita es guardar los datos de su sesión antes de redirigir.

session()->save();
// Redirect the user to the authorization URL.
header('Location: ' . $authorizationUrl);
exit;
Aubrey Kodar
fuente
0

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

if($stmt->num_rows>0) {
$_SESSION['username'] = $_POST['username'];
echo '<script>window.location.href = "http://'.$root.'/includes/functions/signin_action.php?username='.$_SESSION['username'].'";</script>';
error_reporting(E_ALL);

signin_action.php

<?php
require('../../config/init.php');
$_SESSION['username'] = $_GET['username'];
if ($_SESSION['username']) {

echo '<script>window.location.href = "http://'.$root.'/user/index.php";</script>';
exit();
} else {
echo 'Session not set';
}

?>

No es una hermosa solución, pero funcionó.

Flujo de apiladores
fuente
0

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.

Björn Tantau
fuente
0

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

iperich
fuente
Esta respuesta funcionó para mí. Ejecutamos una imagen de máquina de Amazon con nginx. Parece que hay un error de que la carpeta de la sesión no es propiedad del usuario correcto (en nuestro caso www), por lo que el rendimiento chown -R www.wwwen la carpeta de sesiones soluciona el problema.
Joshua
0

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.

almisoft
fuente
0

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.

RewriteEngine on
RewriteCond %{HTTP_HOST} ^yoursitename.com$
RewriteRule ^.*$ "http\:\/\/www\.yoursitename\.com" [R=301,L]
Vishal Kumar
fuente
0

Si está utilizando Wordpress, tuve que agregar este gancho e iniciar la sesión en init:

function register_my_session() {
    if (!session_id()) {
        session_start();
    }
}
add_action('init', 'register_my_session');
Jack
fuente
0

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.

Julius S.
fuente
0

En primer lugar, asegúrese de llamar session_start()antes de usar $_SESSIONvariable.

Si ha deshabilitado el informe de errores, intente encenderlo y ver el resultado.

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Las razones más comunes que no se mencionan en la respuesta de @ dayuloli:

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

  2. El directorio de la sesión puede no ser editable. Puedes consultarlo conis_writable(session_save_path())

F0G
fuente
0

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_pathparámetro en el php.iniarchivo.

Entonces, si alguien lee esto, verifique la php.iniconfiguración antes que nada.

Yova Turnes
fuente
0

Asegúrese de que session_write_closeno se llame entre session_start()y cuando configure su sesión.

session_start();

[...]

session_write_close();

[...]

$_SESSION['name']='Bob'; //<-- won't save
Jordan Daigle
fuente
0

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 PHPSESSIDpara 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é PHPSESSIDa 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 .

dodov
fuente
0

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'!

miapuffia
fuente
0

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 ().

franzisk
fuente
0

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):

ini_set( 'session.cookie_secure', 1 );

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

Oscar
fuente
0
ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session'));
session_start();

Demasiado tarde para responder pero esto funcionó para mí

Vipertecpro
fuente
0

Para mí esto fue un error de permiso y esto lo resolvió:

chown -R nginx: nginx / var / opt / remi / php73 / lib / php / session

He probado algunas horas en PHP y la última prueba que hice fue que creé dos archivos session1.php y session2.php.

session1.php:

session_start();

$_SESSION["user"] = 123;

header("Location: session2.php");

session2.php:

session_start();

print_r($_SESSION);

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.

temo
fuente
1
El chown es una solución MALA, ya que volverá a su valor predeterminado en la actualización del paquete. Vea los comentarios en la configuración predeterminada del grupo (www.conf). Forma correcta si usa otro directorio que no sea el de apache (por ejemplo: / var / lib / php / nginx / session)
Remi Collet
Tienes razón. La actualización del paquete fue la razón de mi problema en primer lugar. Pero como así se hizo y necesitaba una solución rápida, esto ayudó. Mi administrador de SYS lo resolvió, no estoy muy bien con Linux.
temo