我是个新手,所以请原谅我的错误。
我正在使用。shtml页面(SSI)的网站上工作。我试图包括一个PHP脚本到我的。shtml页面。到目前为止,一切都很正常:PHP脚本被包括在内,它做了它的预期目的。下面是实际的例子。首页(index.shtml)包含一个名为security_check.php的脚本,该脚本带有以下指令:
<!--#include virtual="includes/security_check.php?idOp=000&idPage=0000" -->
<?php
session_start();
include('config.php');
include('myfunctions.php');
include('security_functions.php');
$idOp = $_GET['idOp'];
$idPage = $_GET['idPage'];
$allowedReferer = array();
// Connection to the database (defined in myfunctions.php)
$link = DB_Connect($DBhost, $DBuser, $DBpass, 1, $DBname);
// Check if the PHP session already exists. If not, create one
// (that is insert a record in the DB and returns the id, which
// will be stored in the PHP session variable).
// user ID is 0 because not logged yet
if (!isset($_SESSION['idSess'])) {
$_SESSION['idUser'] = 0;
$_SESSION['idSess'] = create_session(); // security_functions.php
}
// Please note that create_session() correctly use $_SESSION['idUser']
// in order to do its work, even if it's not passed as a parameter
// (as it should be: $_SESSION is a superglobal!) and the same goes
// for activity_supervisor().
// Defined in security_functions.php:
// it uses both $_SESSION['idUser'] and $_SESSION['idSess']
activity_supervisor($idPage,$allowedReferer,2,$link);
mysql_close($link);
?>
此时,主页正确显示,并有一个"注册"按钮在其中,调用sign.shtml。这个标志。SHTML页面包括非常相同的 security_check.php脚本与上面看到的完全相同的include指令,除了idPage参数的值,在这种情况下是0001。
我希望脚本能够识别PHP会话,因此不是创建一个新会话,而是每次创建一个新会话。
我已经阅读了所有其他与PHP会话不工作相关的帖子,我甚至尝试了那里提出的解决方案。
session_start()写在每个脚本的顶部,因为只有一个脚本
——会话。Save_path =/var/lib/php/session,可被web服务器写入
-我已经试过设置会话了。gc_probability = 0并重新启动web服务器(无济于事,所以我回到了会话。Gc_probability = 1)
-我尝试了不同的浏览器(即Firefox和Chrome)与相同的结果
所以我尝试了以下测试(注意session_start()之前的两个空行:我总是用这种方式对指令进行空格以提高可读性)创建简单的test.php脚本
<?php
session_start();
if (!isset($_SESSION['foo'])) {
$_SESSION['foo'] = 1;
echo ('Value is '.$_SESSION['foo'].'<br/>');
echo ('<a href="test.php">Refresh</a>');
}
else {
$_SESSION['foo']++;
echo ('Value is '.$_SESSION['foo'].'<br/>');
echo ('<a href="test.php">Refresh</a>');
}
?>
好吧,信不信由你,每次我点击'刷新',值是递增的,因此PHP可以识别会话(test.php脚本与索引位于同一域中)。SHTML和签名。shtml页)。
我甚至试图使PHP脚本显示一个链接到一个。html文件(不是。shtml),然后显示一个链接到test.php。它工作正确!
当PHP脚本包含在.shtml页面中时,会话似乎没有正确设置,只有,即使我没有看到任何原因。也许你知道为什么,最重要的是,如何避免这种无聊的行为?它是一个功能吗?它是否依赖于php.ini中的参数设置?
最后的提示:操作系统:CentOS 6.3与2.6.32-279.el6。x86_64内核
服务器版本:Apache/2.2.15 (Unix)
PHP 5.3.3
服务器是我的,所以我可以配置一切,如果需要的话。
提前感谢并原谅我的长帖子:我努力使它很明显,PHP会话在我所知道的所有其他情况下都能完美地工作。
我不认为这会起作用,因为SSI将执行PHP脚本,然后将其输出发送到web服务器。您将需要某种方式重写url,使它们不依赖于cookie,因为在服务器将cookie发送给浏览器之前,cookie已经被"吃掉"了。
尝试使用
ini_set("session.use_cookies",0);
ini_set("session.use_trans_sid",1);
,然后需要在传出的url(以及POST页面)中发送SID。请看下面的答案。
具体来说,您需要将用户重定向到
而不是sign.shtml
$sidkey = session_name();
$sidval = session_id();
print "sign up: <a href="sign.shtml?{$sidkey}={$sidval}">here</a>";
并将其包含在SSI输出中。
UPDATE:问题的根源是SSI不能创建会话(不能发送任何东西,除了普通的HTML。使用cookie的会话依赖于标头,而不仅仅是HTML)。但是如果你用一个PHP脚本在SSI之外创建会话,它能够设置一个cookie,从那时起,所有的PHP脚本(无论SSI与否)都能够读取 cookie,因此将能够访问并修改会话(这是一个文件/内存/Redis/其他在服务器上由会话cookie的值标识)。
您可以检查是否在SSI中设置了cookie,如果没有,您可以重定向到一个纯PHP页面,该页面设置了会话cookie,并使用HTTP重定向发送回原始shtml