我在我网站的每一页的第一行都写了这个。
include("restd.php");
和restd.php包含以下行:
@session_start();
if(isset($_SESSION['id']))
{
}
else
{
header("location:index.php");
}
我面临的问题是,当我点击或在我的网站上做某事时。它让我退出并带我去index.php。
我确定它与会话有关。香港专业教育学院尝试了每一件事来避免这个问题,但我使用restd.php因为我不希望任何人复制某人的网址并粘贴并进入网站。
任何登录的人都可以查看其他人的页面。如果他们没有登录,那么他们将被重定向到index.php
编辑:让我们感到困惑的是,所有这些都在我的测试服务器上工作正常,这是easyPHP-5.3.8.0但是当我将所有文件上传到我的服务器时,这个问题就出现了。
答案 0 :(得分:45)
您的会话目录(可能是/tmp/
)不可写。
检查session_save_path()
是否可写。
if (!is_writable(session_save_path())) {
echo 'Session path "'.session_save_path().'" is not writable for PHP!';
}
答案 1 :(得分:5)
你真的在页面上设置了$ _SESSION ['id'] ......
您在这里要做的是:
你真的在index.php中做到这一点吗?
session_start();
$_SESSION['id'] = something;
答案 2 :(得分:4)
您需要声明$_SESSION['id']
:
<强> file1.php 强>
session_start();
$_SESSION['id'] = '123'
<强> file2.php 强>
include 'file1.php'
if(isset($_SESSION['id']))
{
}
else
{
header("location:index.php");
}
答案 3 :(得分:1)
我知道这是一个老线程,但是经过几个小时的绝望后,以下内容帮助我解决了同样的问题。发现于:http://php.net/manual/de/function.session-save-path.php
我在公共html文件夹旁边创建了一个文件夹,并将这些行放在index.php的第一个点
会话文件夹的位置:
/域/帐户/会话
index.php的位置
/domains/account/public_html/index.php
我在第0行的index.php中放置了什么:
<?php
ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session'));
session_start();
?>
希望这会节省你的时间。
答案 4 :(得分:0)
夫妻俩:
您的包含文件没有<?php ?>
标记,因此内容不会被评估为PHP
在开始输出任何内容之前,必须先调用Session_start。是这样的吗?
答案 5 :(得分:0)
你仍然没有回答SET $ _SESSION ['id']的位置。 $pid = $_SESSION['id']
未设置会话变量。 session_start()
在任何会话相关之前出现,它在您的包含之前未显示。
答案 6 :(得分:0)
我遇到了同样的问题并找到了解决办法。如果有人可以解释为什么即使有cookie也没有阅读会话,请告诉我。
<?php
// logged.php
// The PHP session system will figure out whether to use cookies or URLs to pass the SID
if(!isset($_COOKIE['PHPSESSID']) && !isset($_GET['PHPSESSID']) && authenticationRoutine(/* Returns true if succesfully authenticated */) ) {
session_id(uniqid("User--"));
session_start();
$_SESSION['id']=session_id();
}
?>
<?php
// Insecure restd.php (The user can forge a stolen SID cookie or URL GET request, but that is inherent with PHP sessions)
if(!isset($_COOKIE['PHPSESSID']) && !isset($_GET['PHPSESSID']) {header('Location: index.php')}
?>
<强> [编辑] 强>
即使cookie存在并且我阻止了开始新会话,但是会话尚未被读取和启动,因此没有可用的会话变量。在这种情况下,我检查会话是否已经首先启动(不使用session_status()
,因为它在PHP 3.5中不存在,由于某种原因它在主机中最为普遍)。如果在PHP中没有启动会话,我会通过测试cookie和GET变量来检查它是否已经启动。如果找到会话ID,脚本将使用该ID恢复会话。如果没有可用的ID,则用户将被重定向到索引。
<?php
// restd.php
if(empty(session_id())) {
if(isset($_COOKIE['PHPSESSID']) && !empty($_COOKIE['PHPSESSID'])) {session_id($_COOKIE['PHPSESSID']);}
elseif(isset($_GET['PHPSESSID']) && !empty($_GET['PHPSESSID'])) {session_id($_GET['PHPSESSID']);}
else {header('Location: index.php'); exit(0);}
session_start();
}
答案 7 :(得分:0)
检查您的会话路径可能不存在 所以你可以使用以下方法保存PHP会话路径:
ini_set(' session.save_path','SOME WRITABLE PATH');
答案 8 :(得分:0)
在我的情况下,我忘了我将PHP标记session.cookie_secure
设置为on
,而开发环境不受TLS保护。