2016-08-10 5 views
1

Ich habe eine Wordpress-Website bei Wordpress.org gehostet. Und auch eine unabhängige PHP-Anwendung, die am gleichen Ort bereitgestellt wird (das gleiche Hosting).PHP-Sitzung verloren geht nach Redirect

Die unabhängige Anwendung hat ihre eigene Login-Seite und Startseite. Wenn sich ein Benutzer anmeldet, lege ich ein Sitzungsflag fest, das angibt, dass sich der Benutzer angemeldet hat. Wenn ich jedoch zur Benutzerhomepage umleite (nach der Anmeldung), gehen alle Werte von $_SESSION verloren.

Cookie-Pfad ist mit dem '/' gesetzt und session.save_path wird auf '/ var/lib/php5'

ich die in PHP session lost after redirect gegebene Antwort geprüft und überprüft haben alle Punkte.

Auch habe ich die Schritte, die hier https://wordpress.org/support/topic/php-_session-info-gets-lost-from-an-external-login-page-to-a-wp-installation erwähnt gefolgt

Aber keiner von ihnen arbeiten.

Kann jemand vorschlagen, was könnte das mögliche Problem und die Lösung dafür sein? Vielen Dank.

PHP Version: 5.5.9-1ubuntu4.19

+0

Kann der Pfad von Ihrem Server beschreibbar sein? Der übliche Pfad für die Sitzung ist '/ tmp /', denke ich. – frz3993

+0

Cross-Site-Sitzungen Hmmmm ich hoffe nicht. Sind das 2 verschiedene Domains? – RiggsFolly

+0

Haben Sie überprüft, ob sich die Cookies Ihres Browsers geändert haben? Ich weiß, dass Sie überprüft haben, ob es aktiviert ist, aber haben Sie überprüft, ob der Browser neue Cookies erhalten hat oder dieselben alten Cookies beibehalten hat? – SOFe

Antwort

0

Sie sollten wirklich nicht kommentieren oder wp_unregister_globals ändern. Checkout http://silvermapleweb.com/using-the-php-session-in-wordpress/ für Beispiele, wie Sitzungen in Wordpress erreicht werden, ohne mit wp_unregister_globals zu verwirren.

Ich benutze dies und es funktioniert einen Genuss:

add_action('init', 'myStartSession', 1); 
    function myStartSession() { 
     if(!session_id()) { 
      session_start(); 
     } 
    } 

Ich würde auch prüfen, Ihre Sitzungsdaten in der Datenbank zu speichern, anstatt in Dateien, vor allem, wie Sie in einer gemeinsam genutzten Server-Umgebung sind. Jeder andere Benutzer auf diesem Server kann möglicherweise auf die Sitzungsdaten Ihrer Site zugreifen und eine Benutzersitzung übernehmen.

In meinem neuesten Plugin habe ich eine neue Tabelle in der Wordpress-Datenbank erstellt, um Sitzungsdaten zu speichern, und dann set_session_save_handler verwenden, um das Verhalten zu ändern. So wurde mein Start Session Skript etwas wie folgt aus:

add_action('init', 'myStartSession', 1); 
    function myStartSession() { 
     if(!session_id()) { 
session_set_save_handler('open_session', 'close_session', 'read_session', 'write_session', 'destroy_session', 'clean_session'); 
     session_start(); 
     } 
    } 

add_action('session_gc', 'session_gc'); 

if (! wp_next_scheduled('session_gc')) 
{ 
    wp_schedule_event(time(), 'hourly', 'session_gc'); 
} 

function open_session() 
{ 
    return true; 
} 

function close_session() 
{ 
    return true; 
} 

function read_session($sessionid) 
{ 
    global $wpdb; 

    $session_table_name = $wpdb -> prefix . "sessions"; 

    $query = $wpdb->prepare(
         "SELECT data FROM $session_table_name 
         WHERE id = %s", 
         $sessionid); 

    $result = $wpdb -> get_var($query); 

    if ($result) 
    { 
     return $result; 
    } else 
    { 
     return ''; 
    } 
} 

function write_session($sessionid,$data) 
{ 
    global $wpdb; 

    $session_table_name = $wpdb -> prefix . "sessions"; 

    $rowsaffected = $wpdb->replace(
          $session_table_name, 
          array(
            'id' => $sessionid, 
            'data' => $data 
          ), 
          array(
            '%s', 
            '%s' 
          )); 

    return true; 
} 

function destroy_session($sessionid) 
{ 
    global $wpdb; 

    $session_table_name = $wpdb -> prefix . "sessions"; 

    $rowsaffected = $wpdb->delete($session_table_name,array('id' => $sessionid),array('%s')); 

    $_SESSION = array(); 

    return true; 
} 

function clean_session($expire) 
{ 
    global $wpdb; 

    $session_table_name = $wpdb -> prefix . "sessions"; 

    $wpdb->query(
     $wpdb->prepare(
       "DELETE FROM $session_table_name 
       WHERE DATE_ADD(last_accessed, INTERVAL %d SECOND) < NOW()", 
       $expire 
     ) 
    ); 

    return true; 
} 

function session_gc() { 
    global $wpdb; 

    $session_table_name = $wpdb -> prefix . "sessions"; 

    $query = "DELETE FROM $session_table_name WHERE last_accessed < date_sub(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)"; 
    $wpdb->query($query); 

} 

Siehe http://www.stormyfrog.com/using-wpdb-outside-wordpress/ für gibt Tipps für die $ wpdb Klasse von außerhalb Wordpress. Sie könnten einfach wp-load.php hinzufügen, dann denke ich, dass Sie das Session-Verhalten kostenlos bekommen würden, da ich ziemlich sicher bin, dass der Init-Hook nach wp-load.php kommt, der Nachteil ist natürlich, dass Sie den Overhead setzen Laden von Wordpress in Ihre eigenen Seiten, die Sie nicht wollen.

Verwandte Themen