大家好,
在开发爱好网站时,我遇到了以下问题。为了防止未经授权的用户访问服务器上的图像文件,我将包含图像的文件夹设置为拒绝 - 在nginx中。这工作正常,但是当我使用以下PHP脚本访问文件夹中的图像文件时,Chrome随机拒绝加载它们,并给出以下错误:"net::ERR_CONTENT_LENGTH_MISMATCH"。对于随机,我的意思是有时图像会加载正常。我试图在 readfile() 调用之前和之后刷新输出缓冲区,但似乎没有什么可以解决问题。提前感谢您帮助我!
PS:如果您想查看更多源代码/配置文件,请告诉我。
PHP脚本:
<?php
if(!empty($_GET['tconst'])) {
//Included login script contains this method
if(login_check($mysqlisecure)) {
$tconst = preg_replace( '#[^.'w]#', '', $_GET['tconst'] );
$file = "{$_SERVER['DOCUMENT_ROOT']}/content/posters/{$tconst}.jpg";
if (file_exists($file)) {
$filesize = filesize($file);
header('Expires: '.gmdate('D, d M Y H:i:s 'G'M'T', time() + (60 * 60 * 24)));
header("Content-Type: image/jpeg");
header("Content-Length: ".$filesize);
readfile($file);
}
}
}
exit();
这最终是一个比PHP脚本更深层次的问题。当连续加载图像时,PHP5-fpm 会创建一个缓存,从中可以更快地处理请求。这里的问题是缓存文件夹是在测试以 root 身份运行的 nginx 配置文件时生成的。当我切换到"生产"时,PHP5-fpm 和 nginx 都可以通过用户 www-data 获得对该文件夹的完全读/写访问权限。当图像下载请求重复多次时,PHP5-fpm 尝试访问缓存文件夹,但它无法访问,因此没有完成请求,因此仅将 65,536 字节发送回客户端。简单的解决方法是删除位于/etc/nginx/fastcgi_temp 的缓存文件夹,让 PHP5-fpm 重新生成它,一切正常。
这次阅读nginx日志文件真的帮助了我
而不是文件大小($file);使用文件大小($fileLocation).与 读取文件($fileLocation); 这对我有用。
header('Content-Length: '.filesize($fileLocation));
ob_clean();
flush();
readfile($fileLocation);