【发布时间】:2022-01-16 06:13:51
【问题描述】:
我不明白为什么 Javascript Fetch API 顽固地拒绝保留我的 PHP 会话。这是一个最小的测试:
loader.php
<?php
session_start();
$_SESSION['test'] = 'OK';
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title></title>
</head>
<body>
<p>Origin session id is <?php echo session_id() ?></p>
<div id="target"></div>
<script>
fetch('data.php', {
method: 'get',
credentials: 'include'
}).then(response => response.text()).then((data) => {
document.getElementById('target').innerHTML = data;
}).catch(function (error) {
console.log(error);
});
</script>
</body>
</html>
data.php:
<?php
session_start();
echo '<p>Target session id is ' . session_id() . '</p>';
if (empty($_SESSION)) {
echo '<p>session is empty</p>';
} else {
echo implode('<br>', $_SESSION);
}
结果:
Origin session id is abe10f9c611066f6400b2ce3d0ee8f97
Target session id is a68e76bf1d5180d79d27a2bcfa3c462c
session is empty
我找到了几个类似的问题/答案,但都没有帮助。 建议的解决方案是为凭据选项提供“include”或“same-site”,但它们都不起作用。
我知道我可以传递会话 ID,但如果可能的话想避免它。
感谢您的帮助
【问题讨论】:
-
如果
data.php脚本中的<?php标记在<?php标记之前确实有空格,则会话将不起作用,并且您的错误日志中应该有headers already sent消息 -
@Shlomtzion:你读过这个问题吗?它说“我知道我可以传递会话 ID,但如果可能的话想避免它。”
-
@RiggsFolly:原始脚本中的“
-
Origin session id is abe10f9c611066f6400b2ce3d0ee8f97是哪里来的,不是这段代码 -
origin session 来自 loader.php:
Origin session id is
标签: javascript php session fetch fetch-api