Las variables de sesión no persisten entre cargas de página

8 minutos de lectura

avatar de usuario
usuario520300

¿Alguien puede decirme por qué las variables de sesión no pasan entre páginas? Estuvieron trabajando hasta hace 2 días. Ahora no lo es? Hay un sistema de terceros que inicia la sesión de los usuarios en función del sistema de terceros. Dirijo a los usuarios a la página de inicio de sesión con la URL de retorno. El sistema de terceros inicia sesión en un usuario y pasa su identificación y un token generado en su extremo y lo devuelve a mi sitio con la identificación y el token en la URL.

Si las sesiones no están configuradas, intento tomar la identificación y el token de la URL y configurar las sesiones. (en funcionamiento) Luego genero mi propio token para validarlo con el token pasado desde el sistema de terceros (en funcionamiento) cuando voy a hacer clic en otra página, las sesiones que configuré no están vacías (????)

Aquí está mi código:

    <?php
    session_start();

    // FUNCTION TO PASS THE URL THE USER IS ON SO THEY COME 
    // BACk TO THIS PAGE AFTER THE LOG IN. IF APPLICABLE
    function curPageURL() {
    $pageURL = 'http';
    if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") {
    $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    } else {
    $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    }
    return $pageURL;
    }

    // DESTROY SESSION INFO IF TIMED OUT
    if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    session_destroy();   // destroy session data in storage
    session_unset();     // unset $_SESSION variable for the runtime
    }

    // SET THE SESSIONS WITH INFO PASSED FROM
    // LOGIN PAGE SENT AS A GET
    if(isset($_SESSION['ID']) && isset($_SESSION['token'])) {}else{
    $_SESSION['ID'] = $_GET['ID'];
    $_SESSION['token'] = $_GET['token'];
    }

    // GENERATE MY TOKEN TO MATCH THE LOGIN SYSTEM TOKEN
    $userIP = $_SERVER['REMOTE_ADDR'];
    $secretkey = 'A Unique Key For The Logged In User Matching the Login System Passed From mydomain.com/login.php';
    $algorithm = 'md5';
    $mm = date('m');
    $dd = date('d');
    $mmdd = $mm.$dd;
    $mytoken = strtoupper(hash($algorithm, $secretkey.$_SESSION['ID'].$userIP.$mmdd));


    $_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp
    // THIS IS WHERE THINGS ARE GOING WRONG
// SESSION token IS NO LONG SET AFTER I Go To another page
// and my token isnt the same any more either because session ID
// is no longer set???
    if($_SESSION['token']==$mytoken){}else{
    header("location: https://mydomain.com/login.php?returnURL=".curPageURL());
    }
    ?>

ok, esto está jodido. Creo que tiene que ser un problema en la configuración de PHP de los proveedores de alojamiento porque creé dos páginas. uno llamado info con este código:

<?
session_start();

$_SESSION['ID'] = "112233";
$_SESSION['token'] = "mytoken";

print $_SESSION['ID'];
print $_SESSION['token'];
?>
<a href="https://stackoverflow.com/questions/6200612/info2.php">info 2</a>

y uno llamado info2 con este código:

<?
session_start();

print $_SESSION['ID'];
print $_SESSION['token'];
?>
<a href="https://stackoverflow.com/questions/6200612/info.php">info</a>

info creada e impresa la sesión ok. cuando hago clic en el enlace para ir a info2, las sesiones no se imprimen. ¿Es este un problema de configuración de alojamiento?

  • Tengo exactamente el mismo problema… excepto que mis cosas están en localhost, usando PHP con IIS

    – Tomas An

    20 de octubre de 2015 a las 1:20

avatar de usuario
Rudi Visser

Como ya se mencionó, asegúrese de llamar session_start() en cada página.

Además, ¿los scripts están en diferentes subdominios? Si lo son, debe establecer el valor INI session.cookie_domain a .DOMAIN.EXT.

Para depurar aún más toda esta situación, realice una simple observación de cookies. Ve si PHPSESSID está presente como una cookie en ambas solicitudes de página, si no es así, entonces este es su problema. No puede almacenar cookies entre dominios a menos que las reconstruya.


En respuesta a su actualización, intente hacer esto debajo de su llamada a session_start():

echo session_id();

Confirme que es el mismo en ambas páginas. Si no, verifique el valor de session.cookie_domain como esto:

echo ini_get('session.cookie_domain');

¿Eso está configurado para algo? De forma predeterminada, debe estar en blanco, si está configurado, especialmente no para su dominio, este es el problema.

También puede intentar depurar el valor de la cookie de PHPSESSID como sugerí primero.

  • ver mi adición a la publicación original

    – usuario520300

    1 de junio de 2011 a las 12:34

  • No he probado esto todavía, pero lo haré. Pregunta… si por defecto echo ini_get(‘session.cookie_domain’); no está en blanco y no es mi dominio, ¿qué hago?

    – usuario520300

    1 de junio de 2011 a las 13:54

  • 2 Opciones, 1: Contacta a tu proveedor de hosting porque está mal, 2: Puedes usar ini_set('session.cookie_domain', '.your.domain'); o ini_set('session.cookie_domain', ''); antes de session_start().

    –Rudi Visser

    1 de junio de 2011 a las 14:02

  • As already mentioned, ensure you're calling session_start() on each page., siempre la respuesta simple que me elude. ¡Saludos, Rudi, puntos de felicitaciones para ti!

    – Descarado

    20 de diciembre de 2016 a las 11:01

  • Revisé todo esto y todavía no puedo hacer que la sesión persista. Veo PHPSESSID establecido, pero mi $_SESSION las variables no se llevan a la carga de la página siguiente.

    – Nicolás Rolando

    15 de enero de 2019 a las 3:39

Lista de Verificación

1. Asegúrese de haber utilizado session_start(); en la página siguiente.

2. ¿Está utilizando el archivo .htaccess?
si es así, elimine el archivo .htaccess y verifique lo mismo.
en algún momento, las reglas de reescritura causan problemas de sesión…

3. Si la sesión funciona bien y solo tiene problemas con el token, verifique que el token enviado en la url esté codificado en url.

  • He comprobado la adición. este problema puede deberse a la configuración del servidor. consulte con su proveedor de alojamiento.

    – Jagadeesan

    6 de junio de 2011 a las 6:12

  • De hecho, tener el archivo .htaccess estaba causando que mi session_start() falle y devuelva falso. ¡Vaya, eso es realmente sutil e insidioso! Thx funciona ahora.

    – IVSoftware

    24 de junio de 2020 a las 16:11

avatar de usuario
Hemant Jadhav

no es el problema del servidor de alojamiento…

revisa tus URL

si un usuario inicia sesión en “example.com”, la sesión se almacenará para “example.com” y no para “WWW.example.com”, por lo que si un enlace va a www.example.com, no tendrá esa sesión.

puede usar htaccess para establecer siempre la URL en “WWW.example.com” use el siguiente código para ello

Motor de reescritura encendido

RewriteCond %{HTTP_HOST} ^hemantjadhav.com$ [NC]

Regla de reescritura ^(.*)$ http://www.hemantjadhav.com/$1 [L,R=301]

(reemplace hemantjadhav con su nombre de dominio)

  • ¡Eso fue todo, revisa tus URL! Me estaba tirando de los pelos y no me di cuenta de que estaba almacenando desde dos sitios diferentes. Uno con www y otro sin.

    – Aprendiz33

    22 de abril de 2021 a las 16:43

avatar de usuario
grisob

Verifique el tamaño del archivo de sesión: (código tomado de esta publicación)

$sessionfile = ini_get('session.save_path') . "https://stackoverflow.com/" . 'sess_'.session_id();  
echo 'session file: ', $sessionfile, ' ';  
echo 'size: ', filesize($sessionfile), "\n";

Si su archivo de sesión tiene un tamaño cero, asegúrese de que aún haya espacio disponible en el disco de su servidor. Ese fue el problema que tuve.

Compruebe el espacio en disco con df -h en un servidor linux.

La respuesta a esto es que fue un error de configuración del alojamiento. La empresa de alojamiento cambió algo y ha funcionado desde entonces.

  • Sería bueno saber qué era.

    – Bernardo

    14 de enero de 2019 a las 8:15

  • en mi caso, también era un problema de alojamiento, era un archivo htaccess que modificaron y agregaron algunas reglas nuevas para versiones específicas de php, parece que htaccess estaba creando confusión entre las páginas y las versiones de php instaladas en el servidor

    – Vikas Kandari

    21 oct 2020 a las 7:30

avatar de usuario
D.Sari

En mi caso, la solución fue tener diferentes nombres de parámetros en $_GET y $_SESSION.

$_SESSION["businessid"] = $_GET["businessid"]; // Leads to problems with session.
$_SESSION["business_id"] = $_GET["businessid"]; //Works perfectly.

Suena raro pero esa es mi experiencia.

  • Sería bueno saber qué era.

    – Bernardo

    14 de enero de 2019 a las 8:15

  • en mi caso, también era un problema de alojamiento, era un archivo htaccess que modificaron y agregaron algunas reglas nuevas para versiones específicas de php, parece que htaccess estaba creando confusión entre las páginas y las versiones de php instaladas en el servidor

    – Vikas Kandari

    21 oct 2020 a las 7:30

avatar de usuario
elhose

La única respuesta para este problema es usar session_start(); en la parte superior de cada página. Funcionará bien. De lo contrario, es posible que deba ponerse en contacto con su proveedor de alojamiento sobre este problema.

  • Al responder una pregunta de hace ocho años con nueve respuestas existentes, es útil explicar qué aspecto nuevo de la pregunta aborda su respuesta. También tenga en cuenta si la respuesta habría funcionado cuando se hizo la pregunta, o si depende de algo que ha cambiado durante esos ocho años.

    -Jason Aller

    12 sep 2019 a las 19:16

  • session_start () se establece en los ejemplos de código de OP. ¿Has leído antes de responder?

    – Craig B.

    24 de agosto a las 2:28

¿Ha sido útil esta solución?