Существуют два метода передачи идентификатора сессии:
Модуль сессии поддерживает оба метода. Метод с cookies является оптимальным, но он не всегда доступен. Поэтому PHP предоставляет второй способ, который внедряет идентификатор сессии непосредственно в URL.
PHP умеет преобразовывать ссылки прозрачно. Однако, если вы используете версию PHP младше 4.2.0, вам следует включить эту возможность вручную при сборке PHP. Под UNIX следует передать конфигуратору опцию --enable-trans-sid. Если эта опция сборки и опция времени исполнения session.use_trans_sid включены, в относительные URI будут автоматически добавляться идентификаторы сессии.
Замечание:
Директива arg_separator.output из php.ini позволяет настраивать разделитель аргументов. Для полной совместимости с XHTML следует указывать &.
В качестве альтернативы вы можете использовать константу
SID
, которая устанавливается при запуске сессии.
Если клиентское ПО не хранит подходящую сессионную
cookie, SID имеет вид session_name=session_id.
В противном случае содержит пустую строку. Таким образом, вы можете
в любом случае внедрять его в URL.
Приведенный ниже пример демонстрирует, как зарегистрировать переменную и как
правильно построить ссылку на другую страницу, используя SID
.
Пример #1 Подсчет количества посещений конкретного пользователя
<?php
session_start();
if (empty($_SESSION['count'])) {
$_SESSION['count'] = 1;
} else {
$_SESSION['count']++;
}
?>
<p>
Здравствуйте, посетитель, вы видели эту страницу <?php echo $_SESSION['count']; ?> раз.
</p>
<p>
<a href="nextpage.php?<?php echo htmlspecialchars(SID); ?>">Нажмите
сюда</a>, чтобы продолжить.
</p>
Функция htmlspecialchars() может использоваться для вывода
SID
с целью предотвращения XSS-аттак.
Вывод SID
способом, показанном выше, не является
обязательным, если опция
--enable-trans-sid была использована при компиляции PHP.
Замечание:
Подразумевается, что неотносительные URL указывают только на внешние сайты и потому
SID
к ним не добавляется, так как это увеличивало бы риски в области безопасности, в частности, риск утечкиSID
другому серверу.