PHP: Utiliser exit(); die(); après header("location: ");

j'ai un système de login/enregistrement d'utilisateur qui utilise simplement

// execute queries, set cookies, etc. here
header("Location: " . getenv("HTTP_REFERER"));

j'ai récemment lu un billet sur exit(); et die(); et je n'avais aucune idée que j'étais censé les utiliser. D'après ce que j'ai compris, ils ont mis fin au PHP? Est-ce exact? Quelle est la meilleure façon de travailler pour cela, en ajoutant simplement une de ces fonctions directement après l'en-tête ever(); l'exécution que j'ai?

J'ai AJAX, jQuery lisant à travers mon connexion.php/s'inscrire.php, cela aura-t-il un impact quelconque?

Edit: d'Autres qu'après l'en-tête();, où dois-je être usitilizing la exit(); ou die(); fonctions? Et est-ce que exit(); est plus utilisé autour de PHP alors que die(); est plus utilisé autour de Perl?

15
demandé sur Pradeep 2011-12-29 13:26:03

5 réponses

j'ai cherché une réponse à ce sujet aussi. Ce que j'ai trouvé:

Pourquoi die() ou exit():

si vous ne mettez pas de die() ou exit() après votre header('Location: http://something') votre script peut continuer à produire un comportement inattendu. Cela peut par exemple entraîner la divulgation d'un contenu que vous vouliez empêcher avec la redirection (HTTP 301). Il se peut que les éléments susmentionnés ne soient pas directement visibles pour un utilisateur final, car le navigateur ne les affiche pas (en raison de la 301). Conclusion, les fonctions exit() et die() empêchent le script de continuer.

différence:

je voulais aussi savoir la différence entre les fonctions qu'il semble il n'y a aucun. Cependant, dans PHP, il y a une différence nette dans la sortie D'en-tête. Dans les exemples ci-dessous, j'ai choisi d'utiliser un en-tête différent mais pour montrer la différence entre exit() et die() qui n'a pas d'importance.

Exit() dans l'action

<?php
    header('HTTP/1.1 304 Not Modified');
    exit();
?>

résultats dans:

HTTP/1.1 304 Not Modified 
Connection: Keep-Alive 
Keep-Alive: timeout=5, max=100

Die() dans l'action

<?php
    header('HTTP/1.1 304 Not Modified');
    die();
?>

résultats dans:

HTTP/1.1 304 Not Modified 
Connection: close

différence

So, die () ferme la connexion et exit () doesn't. Cela dépend de la performance, que vous vouliez ou non garder la connexion ouverte ou la fermer. Les deux ont avantages et inconvénients et dépend de vos exigences spécifiques.

connexions persistantes HTTP sur Wiki

29
répondu GrayMatter 2014-01-05 10:31:47

http://php.net/manual/en/function.exit.php

http://php.net/manual/en/function.die.php

ces fonctions sont utilisées pour interrompre l'exécution du script. Vous besoin utiliser exit ou die pour arrêter l'exécution de votre script après header("Location: " . getenv("HTTP_REFERER")); , parce que, dans d'autres cas, votre script sera exécuté jusqu'à la fin, ce qui peut provoquer un comportement inattendu.

8
répondu Timur 2011-12-29 09:32:30

réponse a déjà été acceptée mais il semble que tout le monde manque le WTF clair dans la question:

header("Location: " . getenv("HTTP_REFERER"));
  1. retourner un référent est facultatif de la part de l'agent utilisateur

  2. il peut être facilement truquées

  3. il n'y a aucune méthode pour dire à l'utilisateur que le login a échoué

  4. il n'y a pas Communication sémantique HTTP d'un échec d'authentification

  5. alors que la variable d'environnement HTTP_REFERER devrait être la même que la variable d'en-tête de requête, elle n'est pas spécifiée dans la RFC 3875, donc même si elle est présentée au serveur web dans la requête, getenv ("HTTP_REFERER") peut retourner une valeur différente

4
répondu symcbean 2011-12-29 13:08:43

quand header() est appelé à la fin d'un script , il n'y a pas besoin d'appeler exit() , ni die() depuis:

le lien vers le serveur sera fermé dès la fin de l'exécution du script, à moins qu'il ne soit fermé plus tôt en appelant explicitement mysql_close(). - php.net/function.mysql-connect

2
répondu cPage 2016-05-30 19:14:52

Ok, ça fait longtemps que la dernière réponse n'a pas été donnée. Quoi qu'il en soit, je suis tombé sur un problème similaire et j'ai vu quelle était ma solution:

die( Header( "Location: mytarget.php?arg1=foobar" ) );

Deux oiseaux avec une pierre semble fonctionner pour moi.

1
répondu Wulfgier 2017-03-22 09:52:07