【问题标题】:PHP Session Gets Lost After Redirect重定向后 PHP 会话丢失
【发布时间】:2016-08-10 18:26:57
【问题描述】:

我有一个 wordpress 网站,托管在 wordpress.org。还有一个独立的PHP 应用程序部署在同一位置(共享同一主机)。

独立的应用程序有自己的登录页面和主页。当用户登录时,我设置了一个会话标志,指示用户已登录。但是,当我重定向到用户主页(登录后)时,$_SESSION 中的所有值都丢失了。

Cookie 路径设置为“/”,session.save_path 设置为“/var/lib/php5”

我已经检查了PHP session lost after redirect 中给出的答案并验证了所有要点。

另外,我已经按照这里提到的步骤https://wordpress.org/support/topic/php-_session-info-gets-lost-from-an-external-login-page-to-a-wp-installation

但这些都不起作用。

谁能提出可能的问题和解决方案?谢谢。

PHP 版本:5.5.9-1ubuntu4.19

【问题讨论】:

  • 你的服务器可以写路径吗?我认为会话的通常路径是“/tmp/”。
  • 跨站点会话 嗯,我希望不是。这是 2 个不同的域吗?
  • 您是否检查过您的浏览器的 cookie 是否已更改?我知道您已经检查过它是否已启用,但您是否检查过浏览器是否收到了新的 cookie 或保留了相同的旧 cookie?
  • @RiggsFolly 这部署在同一个域上,并且重定向也发生在同一个域上(从 http://abc.com/s/login.php 到 http://abc.com/ s/main.php)
  • @frz3993 我也尝试将 session_save_path 设置为不同的物理目录,但没有帮助。

标签: php wordpress session redirect


【解决方案1】:

您真的不应该注释掉或修改 wp_unregister_globals。查看 http://silvermapleweb.com/using-the-php-session-in-wordpress/ 以获取如何在 Wordpress 中实现会话而不与 wp_unregister_globals 混淆的示例。

我用这个,效果很好:

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

我还会考虑将会话数据存储在数据库中而不是文件中,尤其是当您处于共享服务器环境中时。该服务器上的任何其他人都可能访问您的站点会话数据并接管用户会话。

在我最近的插件中,我在 Wordpress 数据库中创建了一个新表来存储会话数据,然后使用 set_session_save_handler 来更改行为。所以我的开始会话脚本变成了这样:

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

}

有关从 Wordpress 外部访问 $wpdb 类的提示,请参阅 http://www.stormyfrog.com/using-wpdb-outside-wordpress/。您可以简单地包含 wp-load.php,然后我认为您将免费获得会话行为,因为我很确定 init 挂钩是在 wp-load.php 之后出现的,当然,缺点是您将开销将 Wordpress 加载到您可能不想要的页面中。

【讨论】:

    猜你喜欢
    • 2013-06-19
    • 1970-01-01
    • 2017-04-06
    • 2014-08-14
    相关资源
    最近更新 更多