PHP 内容长度与自定义内容交付脚本不匹配


PHP Content Length Mismatch with custom content delivery script

大家好,

在开发爱好网站时,我遇到了以下问题。为了防止未经授权的用户访问服务器上的图像文件,我将包含图像的文件夹设置为拒绝 - 在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);