[英]Prevent mod_deflate on zip file served by PHP
我遇到一些麻煩阻止mod_deflate跳進這個場景:
問題在於,Apache總是將內容檢測為php
,因此服務器將ZIP文件視為PHP文件,因此下面的行將無法正常工作 。
<FilesMatch "\.(xml|txt|html|php)$">
SetOutputFilter DEFLATE
</FilesMatch>
關於如何讓Apache區別於同一index.php
框架文件生成的HTML文件或ZIP文件的任何想法。
編輯:
apache日志
[Mon Jun 20 02:14:19 2011] [debug]
mod_deflate.c(602): [client 192.168.0.5]
Zlib: Compressed 50870209 to 50878224 : URL /index.php,
referer: http://demo.dev/
編輯:
提供拉鏈的CI控制器
header('Content-Type: application/zip');
header('Content-Transfer-Encoding: binary');
header("Content-Length: " . filesize($file_location));
header('Content-Disposition: attachment; filename="' . $file_title . '"');
readfile($file_location);
即使是艱難的所有答案都應該在合理的情況下完全有效(並且在提出問題之前進行了實際測試),我之所以無法指示Apache通過MIME-Type縮小文件的原因仍然未知。
我可以通過強制將以下指令放入腳本中來使其按預期工作
apache_setenv('no-gzip', 1);
ini_set('zlib.output_compression', 0);
我確實理解這是一個熱門補丁 ,並沒有解決問題的根源,但到目前為止還不夠。 由於還有其他人可能會遇到相同的標志,上面的代碼留在這里作為臟修復的參考。
你可以:
AddOutputFilterByType
並僅指定您要過濾的內容類型; 要么 mod_filter
。 在FilterProvider
您可以提供一個規則,在響應標頭中找到zip內容類型( application/zip
)時排除過濾器。 您可以使用mod_rewrite
在Apache級別更改請求的mime類型 :
# Serve .zip request as zip-files
RewriteRule \.zip$ - [T=application/zip,E=no-gzip:1]
將它置於框架規則之上,但是這需要使DEFLATE依賴於mime類型而不是文件擴展名,就像使用<FilesMatch>
。
可能它與...一起很好地工作
AddOutputFilterByType DEFLATE text/html
而不是<FilesMatch>
指令。
編輯:
添加了應該在.htaccess上下文中使用的L標志,
並通過no-gzip環境變量另外關閉DEFLATE。
試試這個(因為你的網址似乎以.zip結尾,它可能適合你):
<FilesMatch "\.(xml|txt|html|php)$">
SetEnvIf Request_URI "\.zip$" no-gzip
SetOutputFilter DEFLATE
</FilesMatch>
而不是使用
<FilesMatch "\.(xml|txt|html|php)$">
SetOutputFilter DEFLATE
</FilesMatch>
使用此配置設置壓縮規則。
AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml application/x-javascript application/javascript
這樣,只有在content-type與上述指令匹配時,才會壓縮輸出。
為zip服務的CI控制器已經發送了正確的內容類型標頭,因此不會被壓縮。
header('Content-Type: application/zip');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.