Array $_POST vide

J’ai été confronté au problème suivant deux fois avec un CMS fait maison : poster un formulaire avec la méthode post n’envoyait aucune information à la page définie dans l’attribut action du formulaire. Afficher $_POST :

print_r($_POST);

donnait systématiquement le même résultat :

array();

Mon fichier .htaccess définit Magic_quotes à 0, Register_Globals à 0 et PHP_VER à 5. Puis il contient quelques redirections 301 :

SetEnv MAGIC_QUOTES 0
SetEnv REGISTER_GLOBALS 0
SetEnv PHP_VER 5
Options +FollowSymlinks -MultiViews
RewriteEngine on
rewritecond %{http_host} ^mydomain.be [nc]
rewriterule ^(.*)$ http://www.mydomain.be/$1 [r=301,nc]
Et le problème de $_POST vide vient des redirections 301 redirect. En effet, mon formulaire était posté à http://mydomain.be/index.php à cause d’une balise « base » définie à l’intérieur de la balise « head » de mon document :
<base href=’http://mydomain.be/’ />
et l’attribut action de la balise « form » était le suivant :
<form method=’post’ action=’./index.php’>
A cause des redirections 301 qui font pointer mydomain.be vers www.mydomain.be et le formulaire qui pointe vers mydomain.be/index.php, Apache n’associe pas le tableau $_POST avec www.mydomain.be mais avec le domaine domain.be. D’où le problème de $_POST vide.
J’espère que cet article vous épargnera quelques longues minutes de debugging.