web-dev-qa-db-fra.com

Lancer un en-tête 401 avec php sans redirection

J'ai une fonction php qui ajoute de mauvaises adresses IP à une table MySQL.

Chaque page de mon site vérifie ensuite le tableau et lance un en-tête HTTP 401 si une correspondance est trouvée.

if(badCrawler()){
    header("HTTP/1.1 401 Unauthorized");
    header("Location: error401.php");
}

Est-il possible de le faire sans changer l'URL?

Merci

22
Jms Bnd

Sûr. Juste exit après votre en-tête 401. Pas besoin du tout de header("Location...").

if(badCrawler()){
    header("HTTP/1.1 401 Unauthorized");
    exit;
}

Note latérale: 401 est généralement utilisé en conjonction avec une demande d'authentification.

De les spécifications :

La réponse DOIT inclure un champ d'en-tête WWW-Authenticate (section 14.47) contenant un défi applicable à la ressource demandée.

Il serait peut-être préférable d'utiliser 403 Forbidden pour refuser l'accès, ou même 404 Not Found si vous voulez que le mauvais robot pense que la page n'existe plus:

header("HTTP/1.0 404 Not Found");
exit;

Envoi de contenu

Notez que votre réponse 404 peut entraîner une page vierge dans certains navigateurs, voir la réponse du haut dans ce fil pour une explication complète de la raison pour laquelle cela se produit. Fondamentalement, l'en-tête fonctionne, mais il ne tient qu'à vous d'afficher tout contenu HTML).

Les solutions sont simples, faites écho à votre contenu (ou incluez un fichier séparé) juste avant l'instruction exit.

45
jszobody

Conscient que c'est un peu vieux, mais il est apparu sur une recherche google de "php, 401s".

Est le problème ici que lorsque la page redirige vers error401.php que la page renverra 200 OK, car error401.php s'est bien chargé. Si vous voulez vraiment que la page 401 soit affichée, pourquoi pas?

if(badCrawler()){
     header("HTTP/1.1 401 Unauthorized");
     include("error401.php");
     exit;
}
7
Simon Cooke