繁体   English   中英

PHP Content-Length 标头不起作用

[英]PHP Content-Length header not working

我正在尝试使用此代码下载 .zip 文件

<?php
    $file = "something.zip";
    $size = filesize($file);
    header('Content-type: application/octet-stream');
    header("Content-length: $size");
    header('Content-Disposition: attachment; filename="downloaded.zip"');
    readfile($file);
?>

但它似乎不起作用,即使我尝试将文件大小设置为header("Content-length: 567247784"); . 我只得到一个没有声明大小的文件,或者一个像 28 字节这样的小文件。

我看了这个问题,我想我和海报有同样的问题,但他的解决方案是“存在服务器问题”。 我想我也有服务器配置问题,但他的回答根本没有帮助我。

它与 mod_deflate 挡路有关。 我花了一天时间弄乱 .htaccess 并尝试了一百万种不同的东西,最后这修复了它,但我无法真正解释原因:

    header('Content-Length: '.$filesize);
    header("Content-Range: 0-".($filesize-1)."/".$filesize);

我想补充一点,我的 PHP 配置的内存少于 256MB。

我认为最简单和最好的方法是:

$head = array_change_key_case(get_headers($file, TRUE));
                    $filesize = $head['content-length'];

在这种情况下,尝试删除尾随的?> ?>之后的换行符或空格可以改变结果。

通常,网络服务器会自动设置 Content-Length 标头。

对于调试,您可以使用非常棒的http://fiddler2.com/来检查标头,甚至可以编写任意请求来测试您的假设。 如果内容正文与Content-Length标头不同,Fiddler 将发出警告。

继 TeeraMusic 出色的分析https://stackoverflow.com/a/30569921/820841 之后,该分析将 mod_deflate 确定为罪魁祸首👍


选项 1:(为此请求禁用 DEFLATE)

apache_setenv('no-gzip', '1');

为此请求停止 mod_deflate 的正确方法。


选项 2:(为此 Content-Type 的所有请求禁用 DEFLATE)

控制哪些文件是 DEFLATE 的选项很可能在您的.htaccesshttpd.conf

AddOutputFilterByType DEFLATE "application/atom+xml" \
                              "application/javascript" \
                              ...
  1. 确保您实际上为您的响应设置了正确的Content-Type并且它不仅仅是作为text/html匹配。
  2. 如果您不希望它通过 mod_deflate 传递,请从此列表中删除特定的Content-Type

也许是这个问题: header("Content-length:" . $size); 但我可能是错的

我遇到了同样的问题,在我的情况下,当我在某个 php 文件中发现<?php标签之前包含一个转义字符时,它就解决了。 然后,返回的页面大于$size = filesize($file); 这会导致错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM