使用PHP无法通过HTTPS工作的文件下载(通过HTTP正常工作)

时间:2016-11-29 08:13:58

标签: php https

我在一个奇怪的问题上被困了一天(至少对我而言)。

我在服务器的文件系统上有很多(通常是PDF)文件,我希望通过PHP文件将它们提供给用户,以使业务逻辑更容易(记录下载,在用户上创建文件的名称' filesystems nicer,...)

PHP代码:

// $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):文件已下载到客户端的文件系统,但浏览器无法完成下载,
    • [错误] Chrome 54(MacOS):看起来它甚至无法启动,
    • [错误] Chrome 51(Win7 Enterprise + SP1):它看起来像下载文件但最后却说“#34;网络错误"和文件无法打开,
    • [确定] MSIE11(Win7 Enterprise + SP1):工作得很好
    • [OK] curl in Terminal(MacOS):它运行正常,文件已下载,可以正确的形式打开

到目前为止我尝试了什么:

  • 各种文件大小 - 相同的行为
  • 两个ISP(100Mbit光纤+ 30 / 8Mbit无线) - 相同的行为
  • 将Cloudflare设置为开发模式(因此我应绕过Cloudflare但SSL仍在使用 - 所以我认为这可能是问题的根本原因) - 行为没有变化
  • 添加了某些"断点的记录"在脚本中 - 它甚至可以按预期运行HTTPS请求(HTTP和HTTPS请求之间没有区别)
  • 搜索网络/ StackOverflow,但所有答案都应该已经在上面的PHP脚本中(例如"添加内容处置","删除所有空格")或尝试新的&# 34;下载"超链接HTML元素的属性(但它仍然是新的,并且不容易为"业务需求提供解决方案")

自己尝试(约1.5MB文件)

0 个答案:

没有答案