[英]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 確定為罪魁禍首👍
apache_setenv('no-gzip', '1');
為此請求停止 mod_deflate 的正確方法。
控制哪些文件是 DEFLATE 的選項很可能在您的.htaccess
或httpd.conf
:
AddOutputFilterByType DEFLATE "application/atom+xml" \
"application/javascript" \
...
Content-Type
並且它不僅僅是作為text/html
匹配。Content-Type
。也許是這個問題: header("Content-length:" . $size);
但我可能是錯的
我遇到了同樣的問題,在我的情況下,當我在某個 php 文件中發現<?php
標簽之前包含一個轉義字符時,它就解決了。 然后,返回的頁面大於$size = filesize($file);
這會導致錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.