Portál AbcLinuxu, 12. května 2025 11:44
<?php // force download dialog header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header('Content-Disposition: attachment; filename="test.mp3"'); header('Content-Type: audio/mpeg'); header('Content-Length: ' . filesize('/path/to/test.mp3')); header('Content-Transfer-Encoding: binary'); readfile('/path/to/test.mp3'); ?>Skript volám přes běžný prohlížeč (Firefox) a odchytávám si hlavičky, abych poznal výsledek. Konfigurace Apache je pomocí .htaccess upravena pro kompresi POUZE požadovaných typů souborů, které chci určit na základě mime type. V .htaccess mám:
<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE application/x-javascript </IfModule>Výsledkem tohoto by měla být komprese pouze html, plain, xml, css a js souborů. V PHP si vygeneruji ke stažení mp3 soubor a odešlu správné hlavičky. Tento mp3 soubor NESMÍ být pro mé účely komprimován pomocí mod_deflate. Bohužel právě to se mi děje. Toto chování jsem odzkoušel na distribicích Red Hat, CentOS 5.5, ale i ve Windows (Xampp 1.7.3). Je zajímavé, že v Debianu i Arch Linuxu mi se stejným nastavením vše funguje požadovaným způsobem. Problém bude určitě v konfiguraci Apache, v PHP problém nebude (php.ini je stejné). Změnit definici Apache přes přípony pomocí "AddOutputFilter" není pro mě řešením. Pokud odeberu řádek:
AddOutputFilterByType DEFLATE text/htmlpak se mp3 nabídne ke stažení bez komprese, což je přesně co potřebuji. Skoro to vypadá, že mime type výsledku volaného skriptu je text/html, což mi přijde jako nesmysl, ale přesně tak se to chová. HTML soubory i PHP skripty samozřejmě komprimovat chci. Co může v nastavení Apache toto způsobovat?
<IfModule filter_module> # nepovinne, ak nechceme nejaky "advanced" typ spracovania FilterDeclare gzip # tu je kriterium, kedy sa ma filter spustit #FilterProvider gzip deflate Content-Type $text/html #FilterProvider gzip deflate Content-Type $text/plain #FilterProvider gzip deflate Content-Type $text/xml #FilterProvider gzip deflate Content-Type $text/css #FilterProvider gzip deflate Content-Type $text/javascript #FilterProvider gzip deflate Content-Type $text/rtf #FilterProvider gzip deflate Content-Type $text/url # toto pravidlo nahradza vsetky tie zakomentovane vyssie FilterProvider gzip deflate Content-Type /^text/ FilterProvider gzip deflate Content-Type $application/x-javascript # tu je kam chceme tento filter zaradit ak ich je viac - default = na koniec chainu FilterChain gzip </IfModule>
<IfModule mod_filter.c> <IfModule mod_deflate.c> FilterDeclare COMPRESS FilterProvider COMPRESS DEFLATE Content-Type text/html FilterProvider COMPRESS DEFLATE Content-Type text/plain FilterProvider COMPRESS DEFLATE Content-Type text/xml FilterProvider COMPRESS DEFLATE Content-Type text/css FilterProvider COMPRESS DEFLATE Content-Type application/x-javascript FilterChain COMPRESS </IfModule> </IfModule>http://httpd.apache.org/docs/current/mod/mod_filter.html Podle dokumentace jde o vhodnější cestu, i když možná méně přehlednout. Důležité je, že takto to funguje!
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.