PHP 内容长度与自定义内容传送脚本不匹配

PHP Content Length Mismatch with custom content delivery script

大家好,

在开发一个爱好网站时遇到了以下问题。为了防止未经授权的用户访问服务器上的图像文件,我在 nginx 中将包含图像的文件夹设置为 deny-all。这工作正常,但是当我使用以下 PHP 脚本访问文件夹中的图像文件时,Chrome 随机拒绝加载它们并出现以下错误:'net::ERR_CONTENT_LENGTH_MISMATCH'。随机我的意思是有时图像会加载正常。我曾尝试在调用 readfile() 之前和之后刷新输出缓冲区,但似乎无法解决问题。预先感谢您帮助我!

PS:如果您想查看更多源 code/configuration 文件,请告诉我。

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 运行 的配置文件时生成的。当我切换到 'production' 时,PHP5-fpm 和 nginx 都无法通过用户 www-data 获得对该文件夹的完全 read/write 访问权限。当图像下载请求重复多次时,PHP5-fpm 尝试访问缓存文件夹但无法访问,因此未完成请求,因此仅将 65,536 字节发送回客户端。简单的解决方法是删除位于 /etc/nginx/fastcgi_temp 的缓存文件夹,让 PHP5-fpm 重新生成它,一切正常。

这次阅读 nginx 日志文件对我帮助很大

instead of filesize($file); use filesize($fileLocation) .same as for readfile($fileLocation); This worked for me.

    header('Content-Length: '.filesize($fileLocation)); 
    ob_clean();
    flush();
    readfile($fileLocation);