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

PHP内容长度与自定义内容交付脚本不匹配,php,nginx,header,filesize,Php,Nginx,Header,Filesize,大家好, 在开发爱好网站时,我遇到了以下问题。为了防止未经授权的用户访问服务器上的图像文件,我在nginx中将包含图像的文件夹设置为deny all。这很好,但当我使用以下PHP脚本访问文件夹中的图像文件时,Chrome会随机拒绝加载它们,并给出以下错误:“net::ERR\u CONTENT\u LENGTH\u MISMATCH”。我的意思是,有时候图像会加载得很好。我尝试在readfile()调用前后刷新输出缓冲区,但似乎没有解决问题。提前谢谢你帮了我的忙 PS:如果你想看到更多的源代码/

大家好,

在开发爱好网站时,我遇到了以下问题。为了防止未经授权的用户访问服务器上的图像文件,我在nginx中将包含图像的文件夹设置为deny all。这很好,但当我使用以下PHP脚本访问文件夹中的图像文件时,Chrome会随机拒绝加载它们,并给出以下错误:“net::ERR\u CONTENT\u LENGTH\u 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尝试访问缓存文件夹,但无法访问,因此未完成请求,因此仅向客户端发送65536字节。简单的修复方法是删除位于/etc/nginx/fastcgi_temp的缓存文件夹,让PHP5 fpm重新生成它,然后一切正常

这次阅读nginx日志文件真的帮了我大忙

而不是文件大小($file);使用filesize($fileLocation)。与的相同 readfile($fileLocation); 这对我有用


图像文件平均有多大?我建议您在获取文件大小后进行一些错误检查,如果您查看,您可以看到此函数的返回值可能为FALSE。@GarryWelding图像文件大小读取正确,因为这对于每个请求都保持一致。(检查标题)。但不一致的是,服务器有时发送一个文件大小为305761字节的映像,而在它不工作的随机时间,它只会以65536字节(同样一致但不正确)作为响应。所以有两种情况可能会发生,服务器发送完整的正文,一切正常,或者服务器只发送65536字节的正文和内容长度不匹配。它是否与php fpm或nginx设置(本地托管)有关65536是编程中的一个重要数字,您应该了解更多。。。
    header('Content-Length: '.filesize($fileLocation)); 
    ob_clean();
    flush();
    readfile($fileLocation);