使用PHP下载的文件不能通过HTTPS工作(通过HTTP工作正常)
我被一个奇怪的问题困扰了大约一天(至少对我来说是这样) 我在服务器的文件系统中有许多(通常是PDF)文件,我希望通过PHP文件向用户提供这些文件,以简化业务逻辑(记录下载,使用户文件系统中的文件名更漂亮,…) PHP代码:使用PHP下载的文件不能通过HTTPS工作(通过HTTP工作正常),php,https,Php,Https,我被一个奇怪的问题困扰了大约一天(至少对我来说是这样) 我在服务器的文件系统中有许多(通常是PDF)文件,我希望通过PHP文件向用户提供这些文件,以简化业务逻辑(记录下载,使用户文件系统中的文件名更漂亮,…) PHP代码: // $ext = extension of the file; // $fullPath = full path of the file being downloaded on server's filesystem switch($ext) { case
// $ext = extension of the file;
// $fullPath = full path of the file being downloaded on server's filesystem
switch($ext) {
case "pdf": $ctype="application/pdf"; break;
case "zip": $ctype="application/zip"; break;
case "doc": $ctype="application/msword"; break;
case "xls": $ctype="application/vnd.ms-excel"; break;
...
default: $ctype="application/octet-stream";
}
$fsize = filesize($fullPath);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Content-Type: " . $ctype);
header("Content-Disposition: attachment; filename=\"" . $targetName . "\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $fsize);
ob_clean();
flush();
readfile($fullPath);
重要提示:我使用CloudFlare(免费),所以对于HTTPS,我使用他们的SSL证书(这对其他任何东西都很好,很好)
它的行为如何?
- 如果我使用HTTP调用脚本,一切正常李>
- 使用HTTPS调用时,其行为异常:
- [错误]Safari(MacOS):文件已下载到客户端的文件系统,但浏览器未完成下载
- [错误]Chrome54(MacOS):看起来它甚至没有启动
- [错误]Chrome 51(Win7 Enterprise+SP1):它看起来像是下载了文件,但最后显示“网络错误”,文件无法打开
- [确定]MSIE11(Win7 Enterprise+SP1):工作正常
- [OK]curl-in-Terminal(MacOS):它工作正常,文件可以下载并以正确的形式打开
- 不同的文件大小-相同的行为
- 两个ISP(100Mbit光纤+30/8Mbit无线)-性能相同
- 将Cloudflare设置为开发模式(因此我应该绕过Cloudflare,但仍在使用SSL——因此我认为这可能是问题的根本原因)——行为没有改变
- 在脚本中添加了某些“断点”的日志记录-按预期,它甚至可以为HTTPS请求运行(HTTP和HTTPS请求之间没有区别)
- 搜索web/StackOverflow,但所有答案都应该已经在上面的PHP脚本中(如“添加内容处置”、“删除所有空白”)或尝试超链接HTML元素的新“下载”属性(但它仍然是相当新的,不容易为“业务需要”提供解决方案)
- HTTP:
- HTTPS: