簡體   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