Safari 5.1 in 不允许 <video> 源检测 $_SESSION 变量
Posted
技术标签:
【中文标题】Safari 5.1 in 不允许 <video> 源检测 $_SESSION 变量【英文标题】:Safari 5.1 in doesn't allow <video> source to detect $_SESSION variables 【发布时间】:2011-11-21 11:30:15 【问题描述】:我有一个 download.php 脚本,它检测用户是否使用 $_SESSION 变量登录,并向用户读出一个视频文件。如果我从 Safari 5.0.5 中的元素调用它,脚本会检测到会话变量并按预期工作。在 5.1 中,download.php 不会读取会话变量,并且它的行为就像用户没有登录一样。如果我直接从地址栏调用脚本,它就可以正常工作。如果我从我的 iPhone 打电话,它也会被检测到。有谁知道这是一个错误还是有解决方法?我将不得不重新编写很多内容来尝试不使用会话。谢谢。
这是一个故障排除脚本。这显示了正确的会话数据:
<?php
session_start();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Test</title>
</head>
<body>
<video controls="true" autoplay="false" id="v">
<source src="video.php" type="video/mp4" />
</video>
<?php
echo "<pre>";
var_dump($_SESSION);
echo "</pre>";
?>
</body>
</html>
每次我加载上述页面时都会写入“未检测到会话”,但使用 Safari 5.0.5 和 ios 检测到会话:
<?php
session_start();
// write local error log
function write_log($txt)
$myFile = 'error.log';
$fh = fopen($myFile, 'a') or die("can't open file");
fwrite($fh, "$txt\n");
fclose($fh);
if ($_SESSION)
write_log(date('Y-m-d H:i:s'). ' Session Detected');
else
write_log(date('Y-m-d H:i:s'). ' Session Not Detected');
?>
编辑:Safari Inspector 将调用 video.php 的状态显示为“待处理”,并且除了请求 url 之外没有任何标题。 修复了 session_start,但仍然可以正常工作。
编辑:好的,如果我读取 SERVER 变量,5.1 和 5.0.5 之间的区别在于 5.0.5 具有:HTTP_CONNECTION => 关闭,并且 HTTP_COOKIE 包含 PHPSESSID
编辑:我在 32 位模式下运行 Safari,它又可以工作了......
【问题讨论】:
您能否使用 Safari 开发者工具查看 Safari 在请求 video.php 时发送的 HTTP 标头?请求视频时是否发送 PHP 会话 cookie? 至于调试:您应该查看$_COOKIE
并将$_SERVER
数组转储到日志文件中。完全有可能在您的 Safari 版本中,一个插件 (Quicktime) 接管了下载视频源并且不共享浏览器 cookie 存储。
在session_start()之前,不能输出任何html代码。
【参考方案1】:
如果 cookie 没有自动传递给
<video ...>
<source src="video.php?PHPSESSID=<?php echo session_id(); ?>" type="video/mp4" />
</video>
【讨论】:
以上是关于Safari 5.1 in 不允许 <video> 源检测 $_SESSION 变量的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.1 - 仅 Safari 浏览器上的 iframe 的令牌不匹配问题