sypání divných znaků místo Laděnky
- dundee
- Člen | 23
Ahoj, konečně jsem se začal učit Nette a narazil jsem hned na začátku na nepříjemnou vlastnost:
Místo zobrazení Laděnky s hlášením chyby se mi zobrazila stránka
plná rozsypaného čaje.
Původce jse našel ve třídě Debug řádce 636:
//header(‚Content-Encoding: identity‘, TRUE);// // override gzhandler
K čemu je toto dobré?
Díky
- vlki
- Člen | 218
Vítej!
Tenhle řádek v hlavičce zajišťuje, aby byl výstup z laděnky negzipnutý pokud bylo takové gzipování dříve zapnuto. Např. automaticky v php.ini.
Viz dva komentáře u funkce ob_start: http://www.php.net/…ob-start.php#… a ten pod ním.
Jak se mohlo stát, že vznikla jen hromada rozsypaného čaje? Když jsi to zakomentoval, tak je vše v pořádku?
Editoval vlki (23. 10. 2009 14:05)
- buff
- Člen | 63
Ahoj, tady se to řešilo (nezkoumal jsem dopodrobna, zda to pomůže, mně tehdy informace z tohoto vlákna pomohly): https://forum.nette.org/…naky-php-5-2
- dundee
- Člen | 23
Tak u mě to má z nějákého důvodu úplně opačný výsledek. Webserver odesílá data GZIPnutá a tím, že se do hlavičky nezapíše, že jsou gzipnutá, tak je prohlížeč nerozpozná a vypíše čaj.
Používám Ubuntu, chyba se objevuje v Opeře 10 a FF 3.5. Webserver je Apache 2.2.12 a PHP 5.2.10 běžící ale jako FastCGI, což je možná právě ten problém. Předpokládám, že PHP zapíše do hlavičky, že chce negzipovat, ale Apache to stejně gzipne.
- dundee
- Člen | 23
LM napsal(a):
Nemůže to dělat mod_deflate pro Apache?
Přesně tak. Když mod_deflate vypnu, je výstup v pořádku.
Moc mne bohužel nenapadá, jak takovouto chybu do budoucna ošetřit. Pokud se nemýlím, tak PHP jako FastCGI nemá vůbec přístup k modulům Apache, takže nedokáže zjistit, jestli je mod_deflate aktivní.
- dundee
- Člen | 23
Jod napsal(a):
A nedá sa to nejak v htaccess vypnúť ak je mod_deflate?
Ladenka sa aj tak používa väčšinou na dev. mašine a tam netreba komprimovať.
Teoreticky by měl jít mod_deflate selektivně vypnout pomocí
RemoveOutputFilter php html htm ...
ale bohužel nejde. No nic, tak snad jsem s touhle konfigurací v menšině a zbytek najde tenhle thread :)
Editoval dundee (25. 10. 2009 10:11)
- David Grudl
- Nette Core | 8228
Tohle je ošemetná záležitost – debug zruší všechny output buffering
filtry, aby se bluescreen v nich
někde neztratil. Tím ale zruší i filtr gzhandler, který komprimuje
stránku. Ten už ovšem stačil poslat hlavičku
Content-Encoding: gzip
, kterou ruší pomocí
Content-Encoding: identity
. A to pak koliduje s mod_deflate.
Možných řešení je několik, problém je, že co fungovalo na jednom serveru, se úplně jinak chovalo na jiném. Hodně špatně se to testuje.
Takže buď:
- vyrušit všechny filtry až po gzhandler, ten nechat. Narazil jsem na komplikace s detekcí přes ob_list_handlers(), někdy ten filtr nebyl veden jako ob_gzhandler (pravděpodobně kvůli zlib.output_compression, nevím)
- nerušit filtry vůbec
- možná by pomohlo odesílat
Content-Encoding: identity
pouze v případě, žeContent-Encoding: gzip
bylo odesláno (vizheaders_list()
) – můžete to otestovat?
- dundee
- Člen | 23
David Grudl napsal(a):
- možná by pomohlo odesílat
Content-Encoding: identity
pouze v případě, žeContent-Encoding: gzip
bylo odesláno (vizheaders_list()
) – můžete to otestovat?
U mě to funguje dobře.
/**/if (in_array('Content-Encoding: gzip', headers_list())) header('Content-Encoding: identity', TRUE);/**/ // override gzhandler