Я задаю (и отвечаю) этот вопрос главным образом потому, что я не смог найти ничего, что точно соответствовало бы моим конкретным обстоятельствам, ни в одном из других подобных заданных вопросов SO, и ни один из них, который я прочитал, точно не соответствовал найденному решению. Я надеюсь, что это принесет пользу другим в будущем.
Я пытаюсь установить очень строгий куки-файл сессии, который действителен только для раздела администратора моего сайта, поэтому я использую для этого session_set_cookie_params (). Вот оригинальный код:
// Set session parameters
$session_name = 'PGO_Admin';
$session_lifetime = 86400; // 24 hours, expressed in seconds
$session_cookie_path = './'; // This session is only valid within the confines of the admin folder
$session_cookie_domain = filter_input(INPUT_SERVER,'HTTP_HOST');
session_set_cookie_params($session_lifetime, $session_cookie_path, $session_cookie_domain);
session_name($session_name);
session_start();
Этот код хорошо работает в Firefox, но не работает в IE и Chrome. В Firefox, если я добавлю некоторый код PHP для отображения содержимого $ _SESSION, я получу это:
<!-- SESSION vars:
Array
(
[GitHubVersion] => 2.4.5
[poadmin] => Array
(
[curPage] => main
[uid] => 1
[name] => Dave
[lip] => 127.0.0.1
[prior_login] => Tuesday 9th of December 2014 03:11:56 PM
[ip] => 127.0.0.1
[last_login] => Tuesday 9th of December 2014 03:42:51 PM
[bot_id] => 1
[bot_name] => Test
[logged_in] => 1
)
)
-->
Что я и ожидаю увидеть. Однако в IE или Chrome один и тот же код создает только пустой массив:
<!-- SESSION vars:
Array
(
)
-->
Если я закомментирую вызов session_set_cookie_params (), сценарий будет работать правильно, но файл cookie, который устанавливается, доступен везде на сайте, и это для меня неприемлемо. После нескольких часов ударившись головой о стену, я наконец нашел решение, которое довольно просто. Пожалуйста, смотрите мой ответ для решения.
Вот моя теория:
Кажется, что Firefox «понимает», что «./» означает текущий путь к каталогу, а IE и Chrome — нет. Они ожидают «полного пути» от корня документа сервера, который в моем случае был «/ Program-O-master / admin /». Вооружившись этими знаниями, я пересмотрел код следующим образом:
$session_name = 'PGO_Admin';
$session_lifetime = 86400; // 24 hours, expressed in seconds
$session_cookie_domain = 'http://' . filter_input(INPUT_SERVER,'HTTP_HOST');
$session_cookie_path = str_replace($session_cookie_domain, '', _ADMIN_URL_);
/* The constant _ADMIN_URL_ is set earlier, in a different file */
session_set_cookie_params($session_lifetime, $session_cookie_path, $session_cookie_domain);
session_name($session_name);
session_start();
Это установило «правильный» путь cookie, и теперь все браузеры, с которыми я тестировал (включая несколько, которые не были упомянуты ранее), работают как ожидалось. Я надеюсь, что это поможет другим в будущем.
Других решений пока нет …