2015-10-08 5 views
2

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

<!--#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 сценарий с точно такой же включить директиву уже видели выше значения параметра idPage, который в данном случае является 0001.

кроме я бы ожидать, что сценарий к признать сессию PHP и, следовательно, не создание нового сеанса, но действительно новый сеанс создается каждые раз.

Я уже прочитал все другие сообщения, связанные с сессиями PHP, которые не работают, и я даже попробовал предлагаемые там решения.
- session_start() написано сверху каждого сценария, потому что есть только один скрипт
- session.save_path равен/вар/Lib/PHP/сессии и записываемые веб-сервером
- Я уже пытался для установки session.gc_probability = 0 и перезапуска веб-сервера (безрезультатно, поэтому я вернулся к session.gc_probability = 1)
- Я пробовал с разными браузерами (а именно с Firefox и Chrome) с теми же результатами

Итак, я попробовал следующий тест (обратите внимание на эти две пустые строки перед session_start(): я всегда использую инструкции для повышения удобочитаемости) cre живать простой 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

TL; DR, но ... Знаете ли вы, что вы вставляете ** вывод ** скрипта PHP, а не его код? –

+0

Было бы намного проще, если бы вы просто использовали PHP include вместо SSI для вашего скрипта сеанса. – Derek

+0

Вы не можете вызвать 'session_start()' или что-нибудь, что нужно, чтобы изменить заголовки, просто используя mod_include (SSI). Либо подключайте URL-адрес непосредственно к скрипту PHP, либо используйте ESI. – symcbean

ответ

0

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

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

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

, а затем вам нужно отправить SID в исходящих URL-адресов (и на страницах POST, тоже). См. Например, this answer.

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

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

и включить это в выходной SSI.

UPDATE: корень проблемы заключается в том, что SSI не может создать сеанс (не может отправить ничего, кроме обычного HTML Sessions, которые используют куки полагаются на заголовки, а не только HTML.). Но если вы создаете сеанс с PHP-скриптом, запущенным за пределами SSI, который может установить cookie, с этого момента все скрипты PHP (независимо от того, SSI или нет) могут читать cookie и, следовательно, смогут получить доступ и изменить сеанс (который является файлом/памятью/Redis/other на сервере, идентифицированным значением файла cookie сеанса).

Вы можете проверить whether a cookie is set in SSI, а если нет, вы можете перенаправить на чистую страницу PHP, которая устанавливает cookie сеанса и отправляет обратно в исходный файл shtml с помощью HTTP-переадресации.

+0

@ Исерни Спасибо за ваш ответ. Я все еще не могу (по моей вине, конечно). Я просто попытался создать простой PHP-скрипт и сказать ему – Ambrosia

+0

@Iserni Спасибо за ваш ответ. У меня небольшое обновление (разъяснение). Если я создаю сессию в PHP-скрипте, я продолжаю страницу .shtml, которая включает внешний PHP-скрипт через SSI, этот скрипт видит сессию и все переменные, хранящиеся в ней. Не работает другой способ (например, если я включаю PHP в .shtml-страницу, и этот PHP создает сеанс, следующие скрипты PHP не будут видеть сеанс.Тем не менее, сеанс присутствует в моем браузере, поэтому я думаю, что он просто не распространяется, как я ожидаю. Я попытался установить use_cookies и use_trans_id, но никаких изменений. – Ambrosia

+0

Я пытался лучше объяснить, что происходит. Я также подумал об обходном пути :-) – LSerni

Смежные вопросы