Skip to main content Help Control Panel

Login   A+   A-

Community «   Le forum «   Soupçons de bogues «  

Yacs with FastCGI and Suexec ( debian ) [Solved]

Yacs with FastCGI and Suexec
Solution has been fully integrated

Solution Manager: Bernard

Issue description

Bonjour ;

Je viens de passer de simple CGI/suPHP à FastCGI/Suexec et je rencontre un problème d'entêtes avec Yacs.

En effet, losque je charge la page la première fois, pas de problèmes. Par contre lorsque j'effectue un rechargement ou encore que je tente de charger une autre page du site j'ai le droit une belle erreur 500 ( Internal Error ).

Ce problème apparaît avec PHP4 comme avec PHP5.

Après un petit tail, voici le genre de chose que j'obiens :

ns1:/var/log/apache2# tail error.log
[Wed Mar 05 10:30:21 2008] [error] [client 89.3.162.8] FastCGI: comm with server "/var/www/php-fcgi/primary/php4-fcgi-starter" aborted: error parsing headers: duplicate header 'Status'
[Wed Mar 05 10:30:14 2008] [error] [client 194.250.235.224] FastCGI: comm with server "/var/www/php-fcgi/primary/php4-fcgi-starter" aborted: error parsing headers: duplicate header 'Status', referer: http://www.nuxwin.com/article-38-debian-tutorial-configuration-dns-bind-9
...


Je présise que bissarement, lorsque je vide le cache du browser, la page se charge à nouveau.

Ayant effectué une recherche sur google, je suis "tombé" sur un post évoquant ce genre de problèmes avec wordpress dont voici le lien http://wordpress.org/support/topic/67416

Par ailleurs, dans cette discussion http://bugs.php.net/bug.php?id=36705 ils parlent plus précisément du problème.

D'après ce que j'ai compris, il faut modifier l'entête selon qu'il s'agit de php exécuté en tant que cgi (fastcgi) comme dans cet exemple :

if (substr(php_sapi_name(), 0, 3) == 'cgi')
header("Status: $status");
else
header("HTTP/1.1 $status");


Le problème, c'est que Bernard a particulièrement abusé ( ) en ce qui concerne l'utilisation de la fonction header() et du coup, comme y'en a un peu partout, je sais pas vraiment quoi modifier exactement.

Si Bernard pouvait m'aider à résoudre ce problème, merci.

Ps : A noter que je ne rencontre pas de problème avec mes autre applications (web).

Edit :

Après une petite analyse du code Yacs, il semble que tous les appels à la fonction header() passent par la librairie safe.php. Maintenant, reste à savoir quoi modifier et comment.

A priori, l'entête qui me pose problème est celui-ci (y'en a peut être d'autres...) :

Safe::header('Status: 304 Not Modified', TRUE, 304);


Je vais effectuer des testes mais si tu as déjà la solution Bernard, n'hésite pas.

Comments

Nuxwin
avatar
from Caen, devant mon bureau
Member
190 posts
registered on June 9 2006

on Mar. 5


Bien, après avoir effectué plusieurs testes, j'ai trouvé une solution qui semble fonctionner.

J'ai remplacer la fonction header(); de la librairie safe.php par celle-ci :

function header($attribute$replace=NULL$status=NULL) {
         
          
// Fixed: FastCGI error parsing headers
          
if (substr(php_sapi_name(), 08) == 'cgi-fcgi')
           
$attribute str_replace("Status:""HTTP/1.1"$attribute);

                
// too late
                
if(headers_sent()) {
                        echo 
$attribute."\n\n";

                
// function has been allowed
                
} elseif(is_callable('header')) {
                
                        if(
$status) {
                        
                         
header($attribute$replace$status);
                        } elseif(!
$replace) {
                         
header($attribute$replace);
                        } else {
                         
header($attribute);
                        }
                                
                }
        }



Maintenant, reste à savoir si on doit tchecker la version du protocol HTTP pour les vieux browser (HTTP/1.0)...

Ce qui me semble dingue ici, c'est qu'il faille faire le contraire de ce qui est recommandé sur plusieurs forums, c'est à dire utiliser HTTP/1.1 losrque que php est exécuté via FastCGI.

En effet, dans plusieurs discussions, j'ai pu voir qu'il fallait utiliser Status dans le cas de FastCGI et HTTP/1.1 dans les autres cas. Bref, j'y comprend pas grand chose mais cela fonctionne.

Si tu veux bien jeter un coup d'oeil Bernard

Note : Je rappelle que ce fix ne concerne que les utilisateurs hébergés sur une machine qui exploite PHP 4 ou 5 en tant que programme CGI via FastCGI.
Bernard
avatar
from nearby-an-airport
Associate
6555 posts
registered on Sep. 12 2003

on Mar. 5


Non seulement je veux bien jeter un coup d'oeil, mais le sujet est bigrement intéressant. La manipulation des headers est l'une des grandes forces du protocole HTTP, qui supporte tous les serveurs web du monde. YACS en tire parti autant que possible, par exemple pour optimiser la gestion du cache, pour rediriger les surfeurs d'une page à l'autre, etc.

Les indications fournies ici sont très précieuses, parce qu'elles m'ont fait gagner un temps considérable en recherches diverses. Rien de tel qu'un bug bien documenté pour aller plus vite.

Bon, par où commencer ? Tout d'abord, l'origine du problème, bien en évidence dans les messages d'erreur que tu as relevé, c'est un doublon dans le header Status:, ce qui est a priori interdit par l'interface CGI, et correctement supporté dans les autres cas. Donc je vais tout d'abord rechercher ces cas de doublons éventuels dans le code, et je reviens...
Bernard
avatar
from nearby-an-airport
Associate
6555 posts
registered on Sep. 12 2003

on Mar. 5


Bon, je confirme que YACS ne génère pas de doublon, au moins dans les cas de navigation ordinaires (incluant l'édition de pages).
Bernard
avatar
from nearby-an-airport
Associate
6555 posts
registered on Sep. 12 2003

on Mar. 5


Je suggérerai plutôt la modification suivante :
function header($attribute$replace=NULL$status=NULL) {

    
// CGI and FastCGI error parsing headers
    
if(substr(php_sapi_name(), 03) == 'cgi')
        
$attribute str_replace('Status:''HTTP/1.0'$attribute);

...

Nuxwin
avatar
from Caen, devant mon bureau
Member
190 posts
registered on June 9 2006

inspired from Bernard on Mar. 6


Bernard :

Je te remercie de ta réponse rapide et je suis désolé de t'avoir fait perdre du temps en recherchant des doublons dans le code. Je pensais bien que le problème était ailleurs.

J'ai inséré ton fix (pourquoi http 1.0 et pas 1.1 ?) et celui ci semble fonctionner aussi. Maintenant, j'aimerais bien savoir d'où provient le problème exatement..

Si tu as une explication logique au pourquoi du comment, j'aimerais bien que tu m'en fasse part car j'avoue ne pas bien comprendre et moi, j'aime pas quand je comprend pas.

Je te remercie par avance pour ton éclairage en la matière.

Ce qui est certain, c'est que c'est le genre de bogue qu'il faut absolument fixer de manière définitive dans la mesure ou la plupart des hébergeurs exploitent php via FastCGI.
Bernard
avatar
from nearby-an-airport
Associate
6555 posts
registered on Sep. 12 2003

inspired from nuxwin on Mar. 6


Nuxwin: Ce que j'ai compris des lectures que j'ai pu faire, c'est que PHP, en mode CGI, supporte mal la gestion du 'Status:', d'où l'idée d'utiliser plutôt 'HTTP/1.0' dans ce cas. Et 'HTTP/1.0' plutôt que 'HTTP/1.1', c'est pour être sûr d'être compatible avec tout le monde. Tout ça est très expérimental en tout cas, et il m'a fallu presque deux heures de lecture pour trois lignes de code ajoutées...

En tout cas, c'est grâce à ton intervention et à ton diagnostic initial que le dossier a pu avancer si rapidement. Faute d'environnement FastCGi à ma disposition, je n'aurais pas eu l'idée de me lancer dans ce genre d'investigations par moi-même

Le principal est que ton serveur soir reparti, je me suis fait du souci quand j'ai vu qu'il était fermé hier...

Tags: Yacs - FastCGI - Suexec - bug - header

Rate this page
Posted by Nuxwin on Mar. 5, page edited by Bernard on Mar. 11, (popular)