【问题标题】:PHP session breaks after clicking link to new page that includes config单击包含配置的新页面的链接后 PHP 会话中断
【发布时间】:2016-01-29 03:27:06
【问题描述】:

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

因此,例如,如果我已登录并位于主页 (index.php) 上,但它没有包含配置,那么一切都会正常工作。但是,如果我单击导航栏中的指向 about.php 的链接,该链接确实包含配置,我的会话将被破坏,我需要再次登录。

我已经花了 小时 试图解决这个问题,因此我们将不胜感激。 没有错误或警告。

PHP 版本: PHP 5.5.9(php5-fpmnginx

会话生成

/* 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>

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

【问题讨论】:

  • 不确定是否相关,但您使用的是什么服务器?
  • @NijrajGelani 抱歉,完全忘记了这一点。我正在使用 PHP 5.5.9。
  • $IAreKyleW00t 你的意思是你正在使用 PHP 的开发服务器?
  • 你是如何使用 $_SESSION 的?你能举个例子吗?也许没有调用 session_start()?
  • @NijrajGelani 我正在使用使用apt-get install php5-fpm(使用 nginx)安装的最新版本。 @Naterade 道歉,我也忘了包含这些信息。我添加了会话的启动/生成方式以及使用它的示例页面。

标签: php html session nginx


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-11
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多