这里只是一个新手所以请原谅我的错误 我正在使用.shtml网页(SSI)在网站上工作。 我试图将PHP脚本包含到我的.shtml页面中。 到目前为止一切正常: PHP脚本包含在内,它可以实现预期目标。 这是实际的例子。 主页(index.shtml)包含一个名为security_check.php的脚本,该脚本带有以下指令:
<!--#include virtual="includes/security_check.php?idOp=000&idPage=0000" -->
这是security_check.php的PHP代码:
<?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。 此sign.shtml页面包含非常相同的 security_check.php脚本 使用与上面已经看到的完全相同的include指令,除了idPage参数的值,在这种情况下是0001。
我希望脚本能识别PHP会话,因此 不创建新会话,但确实每隔时间创建一个新会话。
我已经阅读了与PHP会话无关的所有其他帖子,我甚至尝试了那里提出的解决方案
- session_start()写在每个脚本之上,因为只有一个脚本
- session.save_path等于/ var / lib / php / session,可由Web服务器写入
- 我已经尝试设置session.gc_probability = 0并重新启动Web服务器(无效,所以我回到session.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脚本与index.shtml和sign.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会话在我所知道的其他所有情况下都能正常工作。
答案 0 :(得分:0)
我认为这不会起作用,因为SSI将执行PHP脚本,然后将其输出发送到Web服务器。您需要某种方式来重写URL,以便它们不依赖于cookie,因为cookie会被“吃掉”#34;在服务器将它们发送到浏览器之前。
尝试使用
ini_set("session.use_cookies",0);
ini_set("session.use_trans_sid",1);
然后您需要在传出的URL中发送SID(也在POST页面上)。例如,请参阅this answer。
具体而言,您需要将用户重定向到sign.shtml
,而不是
$sidkey = session_name();
$sidval = session_id();
print "sign up: <a href=\"sign.shtml?{$sidkey}={$sidval}\">here</a>";
并将其包含在SSI输出中。
更新:问题的根源在于SSI无法创建会话(无法发送除了纯HTML以外的任何内容。使用的会话cookies依赖于标题,而不仅仅是HTML。但是如果使用在SSI外部启动的PHP脚本创建会话,则可以设置cookie,从那时起,所有PHP脚本(无论是否SSI)都能读取 cookie,因此将能够访问并修改会话(这是由会话cookie的值标识的服务器上的文件/内存/ Redis /其他)。
您可以检查whether a cookie is set in SSI,如果不是,您可以重定向到设置会话cookie的纯PHP页面,并使用HTTP重定向发送回原始shtml。