设置$_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
导致会话由于某种原因变得无效,因此我将该选项留空(这是默认情况下设置的选项)。
我不知道为什么这会导致问题,但它有效。