当SHTML页面中包含脚本时,PHP会话无法正常工作

时间:2015-10-08 14:54:42

标签: php session shtml

这里只是一个新手所以请原谅我的错误 我正在使用.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会话在我所知道的其他所有情况下都能正常工作。

1 个答案:

答案 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。