我有一个PHP网站,提供MP3下载。自从我在一月份启动网站以来,脚本一直运行良好,但是今天早上我收到了用户的错误报告。我提取了她收到的电子邮件的副本,电子邮件中的下载链接会产生此错误:
无法访问此网站 https://www.thefump.com/downloads/order-download-song/2475/m94WxtgV%2BxFE1IZS%2Fkd7VQ%3D%3D处的网页可能暂时关闭,或者已永久移动到新的网址。
ERR_INVALID_RESPONSE
我看了一下代码,发现前3个header()调用正在生成错误。
header('Content-Type: application/octet-stream');
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename='.basename($file));
(下面是完整的代码段。)
如果我注释掉这些行,则MP3作为二进制数据直接在浏览器窗口中加载,因此我知道文件的路径是正确的。
这是完整的下载代码。前三个标头调用由于某种原因而产生错误。剩下的没关系。我最初运行的是ob_clean,但在测试期间将其注释掉,因为正在运行的站点上的另一个类似脚本已将其注释掉。
$file = "<path to file, verified correct>";
header('Content-Type: application/octet-stream');
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . remoteFileSize($file));
// ob_clean();
flush();
readfile($file);
exit;
在研究过程中,我发现了同一位客户上个月下的订单。所有这些下载链接都可以正常工作,并且它们访问相同的脚本。他们只是指向不同的歌曲。 (那是我研究文件路径以及服务器上文件之间的其他差异的时候。)
但是我注意到了另一个区别。无效的脚本在浏览器中显示一个锁定图标,表明它是安全的。起作用的是显示带圆圈的“ i”图标而不是锁,尽管它是通过HTTPS服务的同一服务器上的相同脚本。当我单击“ i”时,它表示通常为“您与该站点的连接不安全”。
是什么导致脚本在一个实例中安全提供而在另一个实例中安全提供?为了使这些标头调用能够在安全页面上工作,我该怎么办?