Corriger les redirections HTTP
La fonction PHP header()
n'interrompt pas l'exécution. Il faudrait la faire suivre de exit();
.
En général, le navigateur ne tiendra pas compte du contenu de la page si l'entête contient une redirection, mais ce contenu va générer des erreurs dans les logs, poser des problèmes de sécurité et de fiabilité.
Exemple : si je demande, hors de toute authentification ou session, une page web:
HTTP/1.1 302 Found
Date: Tue, 06 Feb 2018 14:15:57 GMT
Server: Apache/2.2.15 (CentOS)
X-Powered-By: PHP/5.4.40
Set-Cookie: PHPSESSID=ahrim5rvfnepm7ib9872jn3077; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Location: /index.php
Vary: Accept-Encoding
Content-Length: 1145
Content-Type: text/html; charset=UTF-8
<!DOCTYPE html>
<html lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>LabBook - Gestion des missions</title>
<script src="http://labbook.imag.fr/libraries/jquery/jquery-2.2.1.min.js?v=afb0a920d0493400bf6a104d2c7e7efe"></script>
<link href="../libraries/font_awesome/4.4.0/css/font-awesome.min.css" rel="stylesheet" />
<script src="http://labbook.imag.fr/libraries/jquery/jquery-ui.min.js?v=afb0a920d0493400bf6a104d2c7e7efe"></script>
<link href="../libraries/jquery/jquery-ui.min.css" type="text/css" rel="stylesheet" />
<!-- Styles et fonctions communes aux pages Enseignants -->
<link href="common/authoring.css" type="text/css" rel="stylesheet" />
<script src="http://labbook.imag.fr/authoring_tools/common/authoring.js?v=3cdb04647fcdc589af4c95da1bd802d1"></script>
<!-- Styles et fonctions de la page -->
<link href="lb_missions/lb_missions.css" type="text/css" rel="stylesheet" />
<script src="http://labbook.imag.fr/authoring_tools/lb_missions/lb_missions.js?v=525e5012231ebe19a39c31b26791146d"></script>
</head>
<body>
Erreur de requête dans la base de données
NB : L'entête HTTP doit être envoyé avant le HTML.
Pour la plupart des pages de Labbook, la commande header()
est dans le HTML.
Mais le serveur PHP est configuré avec un output_buffering
, ce qui permet de modifier l'entête HTTP tant qu'il y a peu de HTML affiché (de mémoire, 4Ko).
À la migration de serveur, il faudra absolument garder ce réglage dans le php.ini
.