【发布时间】: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-fpm 为 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>
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 道歉,我也忘了包含这些信息。我添加了会话的启动/生成方式以及使用它的示例页面。