设置 http 标头时丢失会话数据(在 CodeIgniter 中)

Posted

技术标签:

【中文标题】设置 http 标头时丢失会话数据(在 CodeIgniter 中)【英文标题】:Lost session data when setting http headers (in CodeIgniter) 【发布时间】:2011-07-20 20:36:22 【问题描述】:

编辑 #2 好的,问题与我最初的想法不同,所以我将这个“编辑”放在首位。我还更新了问题标题(旧的标题是“从 mysql blob 流式传输 wav 音频”)。

现在问题似乎与 CodeIgniter 会话有关。上面的脚本只有在用户登录时才会运行。出于某种原因,当我手动设置响应标头时(要么 使用 php 的 header() 或 codeigniters 输出类)我可以从我的日志中看到一切都被重新加载和重新初始化——并且会话数据丢失了,所以用户不再登录,所以脚本实际上输出了一个错误。

一旦我删除了对会话数据的任何要求或引用,音频就可以正常播放了……但这并不是一个真正的选择,除非我可以设法以其他方式对用户进行身份验证。非常沮丧。

. . .

** 原文 **

我有一个 mysql blob,其中包含 wav 格式的音频数据。我正在尝试将其输出到浏览器,以便在浏览器想要使用的任何音频播放器插件中进行流式传输。

如果我将它指向物理 .wav 文件,音频播放器可以正常工作,所以这似乎不是问题。但是,如果我将它指向我的 PHP 脚本,我会在 Firefox 中看到一个“搜索合适的插件?”弹出窗口(它无法找到任何东西),而在 Chrome 中只是一个空的非活动播放器。

这是 PHP,$aud 对象包含从数据库中检索到的信息:

header("Content-length: $aud->size");
header("Content-type: audio/x-wav");
echo $aud->recording;
exit();

如果我在上面添加 header("Content-Disposition: attachment; filename=$name"); 我可以下载文件,然后它可以在外部音频播放器中正常播放,但是这不是我想要的。

此代码段是 CodeIgniter 应用程序的一部分,如果这会有所作为的话。我已经设置了路由,以便 /audio/$id.wav 将获取适当的数据并使用上面的代码输出。

任何人都可以看到或想到上述可能不起作用的任何原因吗?

编辑 这些是 php 脚本返回的标头:

Date: Tue, 22 Mar 2011 22:12:06 GMT
Server: Apache/2.2.16 (Ubuntu)
X-Powered-By: PHP/5.3.3-1ubuntu9.3
Set-Cookie: ci_session=<long encrypted session string>; expires=Wed, 23-Mar-2011 00:12:06 GMT; path=/
Content-Length: 12345
Keep-Alive: timeout=15, max=98
Connection: Keep-Alive
Content-Type: audio/x-wav

200 OK

为了比较,当我强制下载上述音频并直接在浏览器中打开该 wav 文件时,会返回这些标头:

Date: Tue, 22 Mar 2011 22:10:53 GMT
Server: Apache/2.2.16 (Ubuntu)
Last-Modified: Tue, 22 Mar 2011 22:08:30 GMT
Etag: "200a83-3039-49f197bfcb380"
Accept-Ranges: bytes
Content-Length: 12345
Content-Type: audio/x-wav

200 OK

保存然后直接打开文件可以工作。将 PHP 脚本输出到浏览器不会。

【问题讨论】:

【参考方案1】:

我将通过比较指向物理 .wav 文件时 Web 服务器发送的 HTTP 内容长度、内容类型和所有其他标头与尝试打开 PHP 时发送的标头来开始调查此问题脚本。我认为实际内容是正确的,根据您的帖子,如果您将文件作为附件下载,则可以使用音频播放器应用程序播放。

【讨论】:

感谢您的建议。我将编辑上面的帖子以包含标题信息。【参考方案2】:

尝试在其中添加此标题:

header('Content-Transfer-Encoding: binary');

看看有没有帮助。

【讨论】:

谢谢,但不——同样的结果。我还添加了“Accept-Ranges: bytes”,看看这是否会有所作为。它没有。 试试看这个课程:phpclasses.org/browse/file/19352.html(对不起,你现在必须在那个愚蠢的网站上注册)但也许它会给你一些启发。

以上是关于设置 http 标头时丢失会话数据(在 CodeIgniter 中)的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 或 HTML 更改 HTTP 请求授权标头

JWT:如何在标头中发送授权?

在 PHP 中从 HTTP 切换到 HTTPS 时会话丢失

在 PHP 中从 HTTP 切换到 HTTPS 时会话丢失

重定向到条带后丢失会话数据

在 HTTP 数据包(Cookie、标头或 JSON)中包含 JWT 令牌的正确方法