sypání divných znaků místo Laděnky

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
dundee
Člen | 23
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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.

LM
Člen | 206
+
0
-

Nemůže to dělat mod_deflate pro Apache?

dundee
Člen | 23
+
0
-

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í.

Jod
Člen | 701
+
0
-

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ť.

dundee
Člen | 23
+
0
-

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
+
0
-

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ě, že Content-Encoding: gzip bylo odesláno (viz headers_list()) – můžete to otestovat?
dundee
Člen | 23
+
0
-

David Grudl napsal(a):

  • možná by pomohlo odesílat Content-Encoding: identity pouze v případě, že Content-Encoding: gzip bylo odesláno (viz headers_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