PHP 会话在单击指向包含配置的新页面的链接后中断


PHP session breaks after clicking link to new page that includes config

设置$_SESSION后,在简单页面下工作正常,但是任何包含inc/config.php的页面都会立即中断该会话并返回到空数组。通过手动键入 URL 访问页面不会中断此会话,这仅在单击指向该页面的链接时发生(即:<a href="some-page.php">Link</a> )。

因此,例如,如果我已登录并在主页(index.php)上,其中不包含配置,则一切正常。但是,如果我单击导航栏中的链接以about.php包含配置的链接,我的会话将被破坏,我需要再次登录。

我花了几个小时试图弄清楚这一点,所以任何帮助将不胜感激。没有错误或警告。

PHP

版本: PHP 5.5.9 ( php5-fpm for nginx

会话生成

/* Start PHP session if none exists */
if (session_status() === PHP_SESSION_NONE) {
    session_start();
    /* 1/5 chance to regenerate ID */
    if (mt_rand(0, 4) === 0) {
        session_regenerate_id(true);
    }
}

会话是使用上面的以下代码在任何需要它的页面上生成的。(即:inc/navigation.php使用会话更改登录/注销链接。

inc/config.php

<?php
    /* Global Salts/Keys; Created with: https://api.wordpress.org/secret-key/1.1/salt/ */
    define('AUTH_KEY',         't!tsg&n;>=C&!?rM[N=rIXGRc)$7+.yh{1x-W2#/ fZJZ(0647q&/G6ZIO,S}v(x');
    define('SECURE_AUTH_KEY',  'm=b&8Xm!i:F3&U.{ajs}]5z10DjH_GV[w|6L=Rlwkosr4O:owE!`VS*-8ro%!3 2');
    define('LOGGED_IN_KEY',    '-krqegOl:}|C;~&r](wA4aB*t)XZ ow*luwt:s(VVR&xAy{Hh*|d`X;`- i*}%+6');
    define('NONCE_KEY',        'svR1:eGpNZ6>^g~-L@ 5K<8KqF3SW(R#OWwI^rL9ll)U3,63Q|{-%de&cUedX47Z');
    define('AUTH_SALT',        '+A!Aj7 Yk|8NWF-+7d,r7tB6+K(obe4AJd-=LGB6#H:} AQI+NQF|w53Eb5#.>Jo');
    define('SECURE_AUTH_SALT', 'hiF_Vd;~XC-UU24c1(s&Q/:XXKTx$8W+Tv%Ed+ =CqS+_K@lW|DwRyk-wC(g5%%p');
    define('LOGGED_IN_SALT',   'q}{W~6(nOfJ(-diA>>K9gkpBq>H4D>d1FTWh|e)NxZe5Xp0H4+n.$*(l&l!G_9cY');
    define('NONCE_SALT',       ',.heuv{eZ) %+DwwmG,9RNybXNAo`FfAi:gR&0<#>-!7NA=)y)-_!qV$2C5R>rJo');
    /* MySQL Database Settings */
    define('SQL_TYPE',          'mysql');
    define('SQL_HOST',          'localhost');
    define('SQL_PORT',          '3306');
    define('SQL_DB',            'database');
    define('SQL_USER',          'username');
    define('SQL_PASSWD',        'password');
    /* Hashing Algorithm; See: http://php.net/manual/en/function.hash.php */
    define('HASH_FUNC',         'sha512');
?>

inc/navigation.php(示例)

<?php
    /* Start PHP session if none exists */
    if (session_status() === PHP_SESSION_NONE) {
        session_start();
        /* 1/5 chance to regerate ID */
        if (mt_rand(0, 4) === 0) {
            session_regenerate_id(true);
        }
    }
?>
<div class="navbar navbar-default navbar-fixed-top">
    <div class="container">
        .
        .
        .
        <div class="navbar-collapse collapse navbar-inverse-collapse">
            <ul class="nav navbar-nav">
                <li><a href="/">Home</a></li>
                <li><a href="/about.php">About</a></li>
            </ul>
            <ul class="nav navbar-nav navbar-right">
                <li class="dropdown">
                    <a href="javascript:void(0);" class="dropdown-toggle" data-toggle="dropdown">Welcome, <?php echo isset($_SESSION['user']) ? $_SESSION['user']['first_name'] : 'Guest'; ?> <b class="caret"></b></a>
                    <ul class="dropdown-menu">
                        <?php if (isset($_SESSION['user'])) : ?>
                            <li><a href="/user.php">User Panel</a></li>
                            <?php if ($_SESSION['user']['level'] == 255) : ?>
                            <li><a href="/admin.php">Admin Panel</a></li>
                            <?php endif; ?>
                        <li class="divider"></li>
                        <li><a href="/logout.php">Logout</a></li>
                        <?php else : ?>
                        <li><a href="javascript:void(0);" data-toggle="modal" data-target="#loginModal">Login</a></li>
                        <li><a href="javascript:void(0);" data-toggle="modal" data-target="#registerModal">Register</a></li>
                        <?php endif; ?>
                    </ul>
                </li>
            </ul>
        </div>
    </div>
</div>

关于.php(示例)

<?php
    /* Load configuration */
    require_once 'inc/config.php'; //This breaks the session
?>
<!DOCTYPE html>
<!--[if lt IE 7]><html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="en"><![endif]-->
<!--[if IE 7]><html class="no-js lt-ie9 lt-ie8" lang="en"><![endif]-->
<!--[if IE 8]><html class="no-js lt-ie9" lang="en"><![endif]-->
<!--[if gt IE 8]><!--><html class="no-js" lang="en"><!--<![endif]-->
    <head>
        <?php include 'inc/meta.php'; ?>
        <title>About :: CSU Clicker</title>
        <?php include 'inc/header.php'; ?>
    </head>
    <body>
        <?php include 'inc/navigation.php'; ?>
        <div class="container">
            <div class="row clearfix">
                <div class="col-xs-12 text-center">
                    <h1>Coming soon!</h1>
                </div>
            </div>
        <?php include 'inc/login-register.php'; ?>
        </div>
        <?php include 'inc/footer.php'; ?>
        <?php include 'inc/notice.php'; ?>
        <?php include 'inc/error.php'; ?>
    </body>
</html>

index.php与此相同,只是顶部没有PHP块。

PHP.ini

为了不破坏这个页面,这里有一个指向我的php的链接.ini以防万一你可能需要它:http://pastebin.com/gXELsEcu

问题出在我的php.ini文件中。session.referer_check设置为 1 导致会话由于某种原因变得无效,因此我将该选项留空(这是默认情况下设置的选项)。

我不知道为什么这会导致问题,但它有效。