Просто новичок здесь, так что прошу прощения за мои ошибки.
Я работаю над сайтом с использованием .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 работают отлично в любой другой ситуации, о которой я знаю.
Я не думаю, что это будет работать, потому что 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.
Других решений пока нет …