第一次访问页面时,PHP 还没有知道浏览器是否接受 Cookie,因此在调用 session_start() 后,SID 将不为空,并且 PHPSESSID 将插入到该页面上所有正确使用 SID 的链接 URL 中。
这将导致,例如,如果搜索引擎机器人首先访问您的主页,则它在您的主页上看到的所以链接都将带有难看的 PHPSESSID=...。
这似乎是默认行为。一个解决方法是开启 session.use_only_cookies,但是这样您就会丢失任何关闭 Cookie 的用户的所有会话数据。
有两种方法可以传播会话 ID
会话模块支持这两种方法。Cookie 是最佳选择,但由于它们并不总是可用,因此我们还提供了一种替代方法。第二种方法将会话 ID 直接嵌入到 URL 中。
PHP 能够透明地转换链接。如果启用了运行时选项 session.use_trans_sid
,则相对 URI 将自动更改为包含会话 ID。
注意:
arg_separator.output php.ini 指令允许自定义参数分隔符。为了完全符合 XHTML,请在那里指定 &。
或者,您可以使用常量 SID
,该常量在会话启动时定义。如果客户端没有发送适当的会话 cookie,它将采用 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>
在打印 SID
时,可以使用 htmlspecialchars() 来防止与 XSS 相关的攻击。
如果使用 --enable-trans-sid 编译 PHP,则不需要像上面那样打印 SID
。
注意:
第一次访问页面时,PHP 还没有知道浏览器是否接受 Cookie,因此在调用 session_start() 后,SID 将不为空,并且 PHPSESSID 将插入到该页面上所有正确使用 SID 的链接 URL 中。
这将导致,例如,如果搜索引擎机器人首先访问您的主页,则它在您的主页上看到的所以链接都将带有难看的 PHPSESSID=...。
这似乎是默认行为。一个解决方法是开启 session.use_only_cookies,但是这样您就会丢失任何关闭 Cookie 的用户的所有会话数据。
如果 php ini 文件中的指令 session.use_trans_sid 设置为 0,则常量 SID 将始终为 ''(空字符串)。
但是,如果 director session.use_only_cookies 为 1,则将 session.use_trans_sid 设置为 1 不会生效。
尝试
session_start(['use_only_cookies'=>0])
或者
session_start(['use_only_cookies'=>0,use_trans_sid=1])