2009-08-09 5 views
4

Où utilisez-vous l'en-tête de commande()?Pour comprendre l'en-tête de PHP()

J'ai le code suivant à handlers/handle_login.php. L'utilisateur est allé sur le site de index.php qui est le point de départ.

if(!$logged_in){ 
    header("Location: index.php");                   
    die("You are not logged_in"); 
} 

Si, si la clause est vrai, je reçois une erreur 404, car l'en-tête me met à handlers/index.php, au lieu de index.php.

+0

Est-ce que votre code fait une autre sortie avant l'appel header()? Si oui, décrivez-le. – fixmycode

+0

Merci pour vos réponses! –

+0

De mes tests, PHP ne semble pas modifier la valeur de l'en-tête 'Location' avant qu'il ne soit envoyé au client. Le navigateur interprète le contexte actuel comme 'handlers /', ou votre environnement possède une traduction d'en-tête 'Location' géniale dont j'ai absolument besoin, parce que j'en ai marre de trouver des moyens de créer dynamiquement des URI absolus. – Zenexer

Répondre

8

Bien que je suis d'accord avec nilamo et comte, je l'espère, je peux donner une image plus grande:

L'utilisation des chemins relatifs peuvent avoir des effets très étranges selon l'endroit où le navigateur « pense » C'est dans la hiérarchie de votre site. Par exemple, supposons que le site possède un fichier d'index '/index.php' mais est configuré pour accepter le module et l'action dans le chemin de l'URI. Vous pouvez très bien avoir une URL qui ressemble à:

http://www.yoursite.com/forms/contact/ 

De cette situation, le retour d'un en-tête comme:

header("Location: index.php"); 

peut très bien que le navigateur pour essayer de demander

http://www.yoursite.com/forms/contact/index.php 

ce qui n'est évidemment pas ce que vous voulez. Pour cette raison, il est généralement préférable d'utiliser '/index.php' comme recommandé ci-dessus, ou encore mieux d'utiliser l'URL complète si possible.

Espérons que cela aide.

+8

J'ajouterai seulement que le RFC HTTP/1.1 indique explicitement que l'URL donnée dans l'en-tête Location doit être absolue, et non relative: "La valeur du champ consiste en un seul URI absolu" (voir http: //www.w3. org/Protocols/rfc2616/rfc2616-sec14.html # sec14.30); même si les navigateurs travaillent généralement avec des URL relatives, vous devez utiliser des URL absolues –

1

Essayez d'utiliser «/»:

if(!$logged_in){ 
    header("Location: /index.php");                   
    die("You are not logged_in"); 
} 

Sans une barre oblique, on suppose que vous faites référence à quelque chose dans le répertoire courant. En plaçant cette barre oblique à l'avant, vous faites référence explicitement au fichier à la racine du site. Comme la page est 'index.php', vous pouvez tout aussi bien utiliser "header ('Location: /')".

+1

Downvoted car la spécification HTTP indique que l'en-tête d'emplacement doit être une URL absolue. Si vous utilisez relatif, cela peut ou peut ne pas fonctionner. –

4

Définissez l'emplacement sur l'URL complète de l'index.php, pas seulement le nom de fichier. Selon php.net, c'est la bonne façon de le faire, n'utilisez pas de chemins relatifs. Voici un exemple:

if(!$logged_in){ 
    header("Location: http://exampledomain.com/index.php"); 
    die("You are not logged_in"); 
} 
+0

Je débogue mes codes hors ligne, donc je ne peux pas utiliser ces URL. Cependant, je ne suis pas sûr si l'URL comme 'http: // localhost/index.php' fonctionne de manière similaire à votre URL. –

+0

Vous pouvez essayer d'utiliser la variable globale $ _SERVER ['SERVER_NAME']. – Phoexo

Questions connexes