Fetch Api - 如何将 PHP SESSION 数据发送到目标 PHP 文件?

Posted

技术标签:

【中文标题】Fetch Api - 如何将 PHP SESSION 数据发送到目标 PHP 文件?【英文标题】:Fetch Api - how to send PHP SESSION data to the target PHP file? 【发布时间】: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 脚本中的&lt;?php 标记在&lt;?php 标记之前确实有空格,则会话将不起作用,并且您的错误日志中应该有headers already sent 消息 @Shlomtzion:你读过这个问题吗?它说“我知道我可以传递会话 ID,但如果可能的话想避免它。” @RiggsFolly:原始脚本中的“ Origin session id is abe10f9c611066f6400b2ce3d0ee8f97是哪里来的,不是这段代码 origin session 来自 loader.php:

Origin session id is

【参考方案1】:

服务器上是否启用了session.cookie_httponly?如果是这样,那将阻止 javascript 调用使用 cookie(一般来说,PHP 会话往往由 cookie 支持)。在此设置的上下文中,http-only 意味着“http/https 允许;javascript/webassembly/...拒绝”。

您可能可以使用phpinfo(); 查看当前值。或在php.net 上阅读更多相关信息。

【讨论】:

session.cookie_httponly 具有默认的 '' 值(空)。我尝试将其设置为 false,但没有帮助。【参考方案2】:

我终于找到了问题的根源。发生这种情况是因为我不在 SSL 中(我在本地主机上)并从我的 .htaccess 发送了这个标头:

Header always edit Set-Cookie (.*) "$1; Secure"

我首先使用 var_dump(session_get_cookie_params()); 检查了我的 cookie,它返回了 ["secure"]=&gt; bool(false)

了解有用:

如果 cookie 参数设置为 .htaccess,则在 PHP session_get_cookie_params() 中返回错误值

这是因为函数正在读取 php.ini 的值,而不是使用 .htaccess 发送的值

【讨论】:

以上是关于Fetch Api - 如何将 PHP SESSION 数据发送到目标 PHP 文件?的主要内容,如果未能解决你的问题,请参考以下文章

将 PHP 异常返回到 javascript FETCH API

使用 Fetch API 将数据发送到 PHP 服务器(首选 POST 方法和 JSON)

Fetch API 无法加载“.php”本地文件 - React JS + PHP

如何使用 Fetch API 从表单中检索和发送数据?

Javascript Fetch API - 如何将输出作为对象保存到变量(不是承诺)

如何将 fetch API 响应转换为 TypeScript 中的特定类型?