Сессия PHP не работает, когда скрипт включен в страницы SHTML

Просто новичок здесь, так что прошу прощения за мои ошибки.
Я работаю над сайтом с использованием .shtml страниц (SSI).
Я пытаюсь включить скрипт PHP в мою страницу .shtml.
До этого момента все работало нормально:
PHP-скрипт включается и выполняет то, для чего он предназначен.
Вот фактический пример.
Существует домашняя страница (index.shtml), включающая скрипт под названием security_check.php с этой директивой:

<!--#include virtual="includes/security_check.php?idOp=000&idPage=0000" -->

Это код PHP для security_check.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 и доступен для записи веб-сервером
— Я уже пытался установить session.gc_probability = 0 и перезапустить веб-сервер (безрезультатно, поэтому я вернулся к 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 работают отлично в любой другой ситуации, о которой я знаю.

2

Решение

Я не думаю, что это будет работать, потому что SSI выполнит скрипт PHP, а затем отправит свой вывод на веб-сервер. Вам понадобится какой-то способ переписать URL-адреса, чтобы они не зависели от файлов cookie, поскольку файлы cookie «съедаются» до того, как сервер отправляет их в браузер.

Попробуйте использовать

ini_set("session.use_cookies",0);
ini_set("session.use_trans_sid",1);

и затем вам нужно будет отправить SID в исходящих URL-адресах (и на страницах POST тоже). Увидеть этот ответ например.

В частности, вам нужно перенаправить пользователя, чтобы не sign.shtml но что-то вроде

$sidkey = session_name();
$sidval = session_id();
print "sign up: <a href=\"sign.shtml?{$sidkey}={$sidval}\">here</a>";

и включите это в вывод SSI.

ОБНОВИТЬ: корень проблемы в том, что SSI не может Создайте сеанс (не может Отправить ничего кроме простого HTML. Сеансы, которые используют куки, основаны на заголовках, а не только на HTML). Но если вы создаете сеанс с помощью PHP-скрипта, запущенного вне SSI, который может установить cookie, с этого момента все PHP-скрипты (будь то SSI или нет) способны читать cookie и, следовательно, будет иметь доступ к и изменить сеанс (который является файлом / памятью / Redis / другим на сервере, идентифицированным значением cookie сеанса).

Ты можешь проверить установлен ли cookie в SSI, и если это не так, вы можете перенаправить на чистую страницу PHP, которая устанавливает cookie сессии и отправляет обратно в исходный shtml, используя HTTP Redirect.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]