Question

Certaines pages Web sont en fait contenues dans ma base de données. J'ai le htaccess avec ce qui suit

ErrorDocument 404 /error404.php

Mon error404 fait un require("checkdb.php");qui vérifie si le nom de fichier est représenté dans MySQL DB. Si c'est le cas, je veux retourner 200 ok et cracher le contenu. Sinon, je veux cracher ce 404

Mon problème est que je suis coincé avec 404. Bien que ma page soit correctement affichée, elle ne sera pas récupérée par le moteur de recherche et que le Google + ne fonctionne pas, il fait un chèque pour la page et il obtient 404.

J'ai ajouté

header('HTTP/1.1 200 OK'); 

Juste après un chèque dans la base de données (aucun code HTML n'a encore été affiché), mais j'obtiens le

Avertissement. Impossible de modifier les informations d'en-tête - les en-têtes déjà envoyés par ....

Même si je bouge ça header() au début de /error404.php Je reçois toujours cette erreur. Il semble qu'Apache renverra ce 404 d'abord puis appelle /error404.php

Que puis-je faire pour résoudre correctement cela? Merci d'avance!

Était-ce utile?

La solution

Lorsque Apache envoie le document spécifié par ErrorDocument, il ne le sert pas de page régulière et a déjà envoyé les en-têtes 404. Au lieu d'utiliser le ErrorDocument Directive dans Apache, vous devez plutôt utiliser votre script PHP pour vérifier d'abord si le document existe, et si c'est le cas, affichez-le. S'il n'existe pas, PHP envoie l'en-tête d'erreur 404 lui-même.

Ce qui suit ne se déroule pas dans l'erreur404.php, mais plutôt dans un script normal comme index.php:

// Do whatever you're doing to check
require("checkdb.php");

// If the check fails, PHP sends the 404:
header("HTTP/1.0 404 Not Found");
// Then display your custom error document with PHP
// You can display the other contents of error404.php
echo "Oops, page wasn't found!";
exit();

Et retirer le ErrorDocument Directive à partir de votre configuration Apache.

Autres conseils

La ligne d'en-tête doit être avant n'importe quel production. Sans un code, il n'y a aucun moyen de souligner d'où vient la sortie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top