Pourquoi cette redirection d’emplacement d’en-tête fonctionne-t-elle après que le contenu a déjà été répercuté?

<? echo "lalala"; header("Location: http://www.google.com/"); 

Si je mets cela dans un fichier php simple et livre sur un serveur apache2 standard avec mod-php (PHP Version 5.3.2-1ubuntu4.10), la redirection vers google fonctionne.

 <? echo "lalala"; flush(); header("Location: http://www.google.com/"); 

ce code ne produit évidemment pas de redirection de travail.

Ma question est de savoir comment le premier code est traité et pourquoi il fonctionne. Parce que je me souviens de fois où ce genre de choses n’était pas possible. Est-ce que mod-php ou apache est assez intelligent pour protéger toute la requête et organiser les en-têtes avant le contenu?

Et:

Puis-je compter sur cela si je m’assure de ne pas vider la sortie manuellement? Parce que cela faciliterait beaucoup mon application …

La mise en mémoire tampon de sortie est probablement activée par défaut. Vous devez l’activer manuellement si vous souhaitez vous fier à cette fonctionnalité.

http://php.net/manual/en/function.ob-start.php

La fonction d’en-tête ADDS un en-tête commun http à la réponse HTTP. Ainsi, la redirection est configurée et le navigateur reçoit le message 302 avant de vous montrer la sortie.

flush ordonne à php d’envoyer la réponse http déjà préparée à l’endroit où il est appelé. C’est pourquoi le deuxième code ne définira pas l’en-tête (il doit être réglé avant d’envoyer n’importe quelle sortie).

Et, le PHP ne devrait pas sortir une seule chose jusqu’à ce que:

  • Le script est traité (même si une erreur arrête l’parsing)
  • vous le définissez pour envoyer la sortie quelque part dans le script avec flush ()

Enfin, vérifiez ceci sur le contrôle de sortie http://www.php.net/manual/en/intro.outcontrol.php