Discussion:
redirection header
(trop ancien pour répondre)
thiebaut olivier
2007-03-20 22:31:15 UTC
Permalink
Bonjour,

Quelqu'un connait-il un moyen simple pour la redirection de page sans
utiliser la fonction header(), j'avoue je sèche.
A chaque fois j'ai un already send, mais comme je tente d'utiliser un
modèle MVC avec contrôleur, il est fort probable "qu'il y ait un echo ou
print qui traine" bref une idée.

Olvier
Olivier Miakinen
2007-03-20 23:10:52 UTC
Permalink
Post by thiebaut olivier
Quelqu'un connait-il un moyen simple pour la redirection de page sans
utiliser la fonction header(), j'avoue je sèche.
Sur le même site, la réponse est toujours la même : utiliser include()
ou require() plutôt que header("Location: ...").
Post by thiebaut olivier
A chaque fois j'ai un already send, mais comme je tente d'utiliser un
modèle MVC avec contrôleur, il est fort probable "qu'il y ait un echo ou
print qui traine" bref une idée.
Un modèle MVC avec contrôleur, je suppose que ce n'est pas réparti sur
trois ou quatre serveurs différents, dont la solution du require() est
la bonne.

Sinon, vérifie que tu ne sauves pas tes pages en UTF-8 avec un éditeur
de texte mou du bulbe qui te rajouterait au début un « BOM » Unicode
traduit en UTF-8.
thiebaut olivier
2007-03-21 11:29:49 UTC
Permalink
Bonjour,

et merci.
Je m'en doutais pour le include ou rewrite.
Pour ce qui est de header, je pense avoir trouvé.
Comme me petit accepte rien en sorti, j'ai vu que j'utilise une
primitice ini_set(...) qui renvoie un résultat. Je vais donc essayé de
récupérer la valeur de retour dans une variable, pour mapper la sortie.

Bref je teste + s'il y a un mou du bulbe ...;).

Olivier
Bruno Desthuilliers
2007-03-21 11:29:49 UTC
Permalink
Post by Olivier Miakinen
Post by thiebaut olivier
Quelqu'un connait-il un moyen simple pour la redirection de page sans
utiliser la fonction header(), j'avoue je sèche.
Sur le même site, la réponse est toujours la même : utiliser include()
ou require() plutôt que header("Location: ...").
Ca ne fait pas du tout la même chose.
Thief13
2007-03-21 22:06:33 UTC
Permalink
Post by Olivier Miakinen
Post by thiebaut olivier
Quelqu'un connait-il un moyen simple pour la redirection de page sans
utiliser la fonction header(), j'avoue je sèche.
Sur le même site, la réponse est toujours la même : utiliser include()
ou require() plutôt que header("Location: ...").
Par rapport à ça j'ai essayé cette solution, mais je ne la trouve pas
satisfaisante : dans chacun de mes scripts, je défini une constante que
j'appelle DROITS et qui contiens les droits requis pour exécuter ce
script. Maintenant, imaginons que j'ai la page modifier.php qui ne
demande que des droit édition (valeur = 2), et que cette page à deux
boutons :
- un qui envois vers supprimer.php (droit nécessaire de suppression = 3)
- un autre qui envoi vers enregistrer.php (toujours droits d'édition = 2)
Jusque là, pas de problème, on passe d'une page à l'autre avec le lien
du form, mais une fois que le script de modification de la base de donné
(que se soit supprimer.php ou enregistrer.php) à fini de s'exécuter, je
veux revenir sur modifier.php, et là, si je fait un include, j'ai un
beau message d'erreur me disant que ma constante est déjà défini, donc,
il ne me reste plus que le header()...

Donc, si il y à une solution, autre qu'utiliser une variable à la place
de ma constante, je suis preneur...
John GALLET
2007-03-22 07:35:18 UTC
Permalink
Post by Thief13
Donc, si il y à une solution, autre qu'utiliser une variable à la place
de ma constante, je suis preneur...
Définir la constante dans une seule fonction/méthode, tout simplement. Ou
bestialement :

if(defined('MACONSTANTE')) return;
// [....]
define('MACONSTANTE','droits');

Je ne vois vraiment pas où est le problème.
a++;
JG
Thief13
2007-03-22 11:33:39 UTC
Permalink
Post by John GALLET
Post by Thief13
Donc, si il y à une solution, autre qu'utiliser une variable à la place
de ma constante, je suis preneur...
Définir la constante dans une seule fonction/méthode, tout simplement. Ou
if(defined('MACONSTANTE')) return;
// [....]
define('MACONSTANTE','droits');
Je ne vois vraiment pas où est le problème.
a++;
JG
Le probleme, c'est que dans ce cas, je me retrouve avec les droits d'un
script sur un autre...

Chaque script à ses propres droits, et si j'inclu un script dans un
autre avec cette métode, ce ne seronts pas les bons droit qui
s'appliqueronts.

En plus, autre problème : dans chauqe script, je fait un
require('fonctions.php'), et si je fait l'include d'un script dans un
autre, paf, erreur puisque il me dit qu'il ne peut pas redéclarer des
fonctions déjà déclaré...
Thief13
2007-03-23 09:05:52 UTC
Permalink
Post by Thief13
Le probleme, c'est que dans ce cas, je me retrouve avec les droits d'un
script sur un autre...
Chaque script à ses propres droits, et si j'inclu un script dans un
autre avec cette métode, ce ne seronts pas les bons droit qui
s'appliqueronts.
En plus, autre problème : dans chauqe script, je fait un
require('fonctions.php'), et si je fait l'include d'un script dans un
autre, paf, erreur puisque il me dit qu'il ne peut pas redéclarer des
fonctions déjà déclaré...
Pas de solution à proposer pour ce cas ? parceque franchement, je suis
pres à passer à une autre méthode, je n'aime pas bien utiliser des
techniques déprécié, mais par rapport à mon cas, je ne vois pas comment
faire autrement...
John GALLET
2007-03-23 14:32:24 UTC
Permalink
Post by Thief13
Pas de solution à proposer pour ce cas ? parceque franchement, je suis
pres à passer à une autre méthode, je n'aime pas bien utiliser des
techniques déprécié, mais par rapport à mon cas, je ne vois pas comment
faire autrement...
Je n'en sais rien, "chez moi ça marche". Je gère des droits différents
pour chaque page d'admin (plus la propriété des données), l'équivalent de
root faisant "su" pour qu'un administrateur central puisse se substituer à
n'importe quel administrateur régional et executer *exactement le même
code* à la définition des droits près, et je n'ai jamais eut aucun
problème de type redéfinition de constante.

Autre point : il est évident (?!) que les droits associés à la session
comme les droits nécessaires à la fonctionnalité demandée pour la page ne
transitent JAMAIS vers le navigateur et sont EXCLUSIVEMENT conservés côté
serveur... sinon n'importe quel guignol prend les droits qu'il veut.

Je reçois une requête me disant "exécute telle action" par http, je
regarde quel niveau d'accès il faut par rapport à cette action dans la
configuration de l'application, je regarde les droits d'accès associés à
la session courante, si c'est bon j'exécute, sinon c'est
exit(require('fuckyou.php')); et quoi qu'il en soit, à la fin de
l'exécution, j'affiche le résultat et la "page suivante" avec des liens /
formulaire qui contiennent évidemment (?) uniquement l'identifiant de
session. Donc je ne vois vraiment pas comment on peut se touiller les
crayons.

a++;
JG
Thief13
2007-03-23 17:34:56 UTC
Permalink
Post by John GALLET
Autre point : il est évident (?!) que les droits associés à la session
comme les droits nécessaires à la fonctionnalité demandée pour la page ne
transitent JAMAIS vers le navigateur et sont EXCLUSIVEMENT conservés côté
serveur... sinon n'importe quel guignol prend les droits qu'il veut.
Pour ma part, je stoque les droits dans la session... est-ce la bonne
manière de faire ? si non, quelle autre solution ais-je ?
Post by John GALLET
Je reçois une requête me disant "exécute telle action" par http, je
regarde quel niveau d'accès il faut par rapport à cette action dans la
configuration de l'application, je regarde les droits d'accès associés à
la session courante, si c'est bon j'exécute, sinon c'est
exit(require('fuckyou.php')); et quoi qu'il en soit, à la fin de
l'exécution, j'affiche le résultat et la "page suivante" avec des liens /
formulaire qui contiennent évidemment (?) uniquement l'identifiant de
session. Donc je ne vois vraiment pas comment on peut se touiller les
crayons.
Pour ma part, chaque action est dans un fichier diférents, et les
fichier sont stocké dans des répertoires, dans lequel je rajoute un
fichier droit.php, qui contient la constante qui défini le droit
nécessaire pour executer le script. et tous les script font un require
sur le fichier droits.php qui est dans leur repertoire. Chaque droit est
un nombre premier, et les droits de l'utilisateur est un facteur de tout
les droits qu'il a. Donc en fait, les droits sont géré par répertoires,
et la séparation des script me facilite la maintenance... Apres, est-ce
une bonne mani_re de faire ?
John GALLET
2007-03-28 12:14:48 UTC
Permalink
Bonjour,
Post by Thief13
Pour ma part, je stoque les droits dans la session... est-ce la bonne
manière de faire ? si non, quelle autre solution ais-je ?
Oui, nécessairement liés à la session, quel que soit son mode de stockage.
Post by Thief13
les droits qu'il a. Donc en fait, les droits sont géré par répertoires,
et la séparation des script me facilite la maintenance... Apres, est-ce
une bonne mani_re de faire ?
Sur le fond, oui, c'est (aussi) une bonne manière de faire. Après si tu
fais un reset des données mémoire locale au script par un header location
(qui implique un ping pong http) tu ne te poses pas de questions car toute
exécution de script "public" est "neuve" (avec tous les rechargements
mémoire/sgbdr que ça implique en plus du ping-pong totalement inutile). Si
tu peux/veux exécuter un script par require local, il y a potentiellement
quelques adaptations : une constante ne peut pas être redéfinie, et
require_once( ) pour éviter les définitions multiples de fonctions. Là
c'est de l'organisation de code, pas plus.

JG
Thief13
2007-03-28 15:00:08 UTC
Permalink
Post by John GALLET
Sur le fond, oui, c'est (aussi) une bonne manière de faire. Après si tu
fais un reset des données mémoire locale au script par un header location
(qui implique un ping pong http) tu ne te poses pas de questions car toute
exécution de script "public" est "neuve" (avec tous les rechargements
mémoire/sgbdr que ça implique en plus du ping-pong totalement inutile). Si
tu peux/veux exécuter un script par require local, il y a potentiellement
quelques adaptations : une constante ne peut pas être redéfinie, et
require_once( ) pour éviter les définitions multiples de fonctions. Là
c'est de l'organisation de code, pas plus.
Me voilà un peut rassuré.
Je n'avais pas pensé à require_once() (quel imbécile !) ça reglerais une
bonne partie du problème, mais au niveau des constantes, la seule
manière de gérer le problème serait de les remplacer par des
variables... et je ne suis pas super chaud pour déclarer les droits
d'exécutions dans des variable, surtout dans un script qui passe son
temps à faire des includes, car je me retrouverais avec un gros risque
de redéfinission par l'utilisateur qui pourais faire correspondre les
droits requis avec les droits qu'il a...

Bruno Desthuilliers
2007-03-22 11:33:39 UTC
Permalink
Post by Thief13
Post by Olivier Miakinen
Post by thiebaut olivier
Quelqu'un connait-il un moyen simple pour la redirection de page sans
utiliser la fonction header(), j'avoue je sèche.
Sur le même site, la réponse est toujours la même : utiliser include()
ou require() plutôt que header("Location: ...").
Par rapport à ça j'ai essayé cette solution, mais je ne la trouve pas
satisfaisante : dans chacun de mes scripts, je défini une constante que
j'appelle DROITS et qui contiens les droits requis pour exécuter ce
script. Maintenant, imaginons que j'ai la page modifier.php qui ne
demande que des droit édition (valeur = 2), et que cette page à deux
- un qui envois vers supprimer.php (droit nécessaire de suppression = 3)
- un autre qui envoi vers enregistrer.php (toujours droits d'édition = 2)
Jusque là, pas de problème, on passe d'une page à l'autre avec le lien
du form, mais une fois que le script de modification de la base de donné
(que se soit supprimer.php ou enregistrer.php) à fini de s'exécuter, je
veux revenir sur modifier.php, et là, si je fait un include, j'ai un
beau message d'erreur me disant que ma constante est déjà défini, donc,
il ne me reste plus que le header()...
C'est AMHA une mauvaise raison pour faire ce qui devrait être fait de
toutes façons. La bonne raison étant que c'est encore ce qui respecte le
mieux la norme HTTP. Et accessoirement, ça évite le problème de la
re-soumission de formulaire par retour à la page précédente...
Thief13
2007-03-22 13:32:43 UTC
Permalink
Post by Bruno Desthuilliers
C'est AMHA une mauvaise raison pour faire ce qui devrait être fait de
toutes façons. La bonne raison étant que c'est encore ce qui respecte le
mieux la norme HTTP. Et accessoirement, ça évite le problème de la
re-soumission de formulaire par retour à la page précédente...
Excuse moi, mais je n'ais pas tres bien compris ce que tu voulais dire...
Tu veux dire qu'il y a une bonne raison pour utiliser les header dans
mon cas ?
Et je ne comprend pas cette histoire de re soumission des formulaire, je
n'ais jamais eu ce probleme...
Bruno Desthuilliers
2007-03-22 21:00:08 UTC
Permalink
Post by Thief13
Post by Bruno Desthuilliers
C'est AMHA une mauvaise raison pour faire ce qui devrait être fait de
toutes façons. La bonne raison étant que c'est encore ce qui respecte le
mieux la norme HTTP. Et accessoirement, ça évite le problème de la
re-soumission de formulaire par retour à la page précédente...
Excuse moi, mais je n'ais pas tres bien compris ce que tu voulais dire...
Tu veux dire qu'il y a une bonne raison pour utiliser les header dans
mon cas ?
En bref : oui. A défaut d'être une application stricte de la norme HTTP,
c'est ce qui en respecte le plus l'esprit, et ce qui évite le plus de
problèmes.

Après, il ne s'agit pas d'en faire une religion. La norme HTTP n'étant
de toutes façons respectée par à peu près aucun user-agent à ce jour -
et la grande majorité des "développeurs web" ne l'ayant jamais lue -,
c'est plus une "moins pire pratique" (je n'ose parler de "bonne
pratique" dans ce cas) qu'autre chose, et c'est à nuancer en fonction
des cas concrets.
Post by Thief13
Et je ne comprend pas cette histoire de re soumission des formulaire, je
n'ais jamais eu ce probleme...
Si suite à une requête POST tu retournes un 200 et que l'utilisateur
utilise la fonction "page précédente" de son navigateur, la même requête
POST sera à nouveau soumise. En général, le navigateur averti
l'utilisateur et lui demande confirmation, mais c'est un peu
insuffisant. Une célèbre application de e-commerce open-source permet
ainsi à un utilisateur de payer deux fois la même commande...

Mes deux centimes.
Olivier Miakinen
2007-03-22 22:38:28 UTC
Permalink
Post by Bruno Desthuilliers
Si suite à une requête POST tu retournes un 200 et que l'utilisateur
utilise la fonction "page précédente" de son navigateur, la même requête
POST sera à nouveau soumise.
Je crains le pire.
Post by Bruno Desthuilliers
En général, le navigateur avertit
l'utilisateur et lui demande confirmation, mais c'est un peu
insuffisant.
Et comment que c'est insuffisant. Ce n'est pas au navigateur de vérifier
qu'on ne fait pas deux fois la même requête. C'est au serveur, bien sûr.
Post by Bruno Desthuilliers
Une célèbre application de e-commerce open-source permet
ainsi à un utilisateur de payer deux fois la même commande...
J'avais raison de craindre le pire. Si l'application ne contrôle pas ce
cas *côté serveur*, ce n'est pas un header("Location") qui empêchera les
requêtes d'être faites deux fois. Ou dix fois. Ou mille fois.

Oui, je sais, autoincrément toussa... ce point n'aurait-il pas par
hasard été déjà traité dans l'excellent document de john Gallet,
http://www.saphirtech.com/p5/web_dynamique.pdf ?
Bruno Desthuilliers
2007-03-23 01:01:02 UTC
Permalink
Post by Bruno Desthuilliers
Si suite à une requête POST tu retournes un 200 et que l'utilisateur
utilise la fonction "page précédente" de son navigateur, la même requête
POST sera à nouveau soumise.
NB : cf correctif dans un autre post : je voulais bien sûr parler du
rechargement de la page, pas du retour à la page précédente...

Et évidemment, ça n'exclue en rien les vérifs côté serveur. Ca évite
juste une cause courante d'"accident".
Bruno Desthuilliers
2007-03-23 01:01:02 UTC
Permalink
Post by Bruno Desthuilliers
C'est AMHA une mauvaise raison pour faire ce qui devrait être fait de
toutes façons. La bonne raison étant que c'est encore ce qui respecte le
mieux la norme HTTP. Et accessoirement, ça évite le problème de la
re-soumission de formulaire par retour à la page précédente...
fatigué, le garçon. Je voulais dire : par rechargement de la page...
Bruno Desthuilliers
2007-03-21 11:29:49 UTC
Permalink
Post by thiebaut olivier
Bonjour,
Quelqu'un connait-il un moyen simple pour la redirection de page sans
utiliser la fonction header(),
Non.
Post by thiebaut olivier
j'avoue je sèche.
A chaque fois j'ai un already send,
Tu a donc un début de sortie avant l'appel à header().
Post by thiebaut olivier
mais comme je tente d'utiliser un
modèle MVC avec contrôleur,
Avec vue et modèle aussi ?-)
Post by thiebaut olivier
il est fort probable "qu'il y ait un echo ou
print qui traine" bref une idée.
Ou juste n'importe quel caractère (même invisible - la suggestion
d'Olivier concernant un BOM n'est pas à négliger) en dehors d'une balise
<?php ?>.
Thierry
2007-03-21 11:29:49 UTC
Permalink
Post by thiebaut olivier
Bonjour,
bonjour
Post by thiebaut olivier
Quelqu'un connait-il un moyen simple pour la redirection de page sans
utiliser la fonction header(), j'avoue je sèche.
A chaque fois j'ai un already send, mais comme je tente d'utiliser un
modèle MVC avec contrôleur, il est fort probable "qu'il y ait un echo ou
print qui traine" bref une idée.
oui mais c'est mal aimé, pas du tout universel (javascript) et limite HC
ici.

//------------------------------------------------------------------------
...
?>
<script type='text/javascript'/>
window.location.href = 'http://www.yahoo.fr';
</script>
<a href='http://www.yahoo.fr'>redirigez</a> vous!
<?php
...
//------------------------------------------------------------------------

Si tu l'adoptes tu risques au moins d'avoir des surprises avec les fonctions
de navigation
des butineurs. Donc bien penser avant d'agir.

pas taper merci
c'est pour rendre service

thierry
Philippe Le Van
2007-03-21 11:29:49 UTC
Permalink
Bonjour
Post by thiebaut olivier
Quelqu'un connait-il un moyen simple pour la redirection de page sans
utiliser la fonction header(), j'avoue je sèche.
Si tu ne veux pas utiliser de header('Location... , tu peux utiliser du
javascript pour faire ta redirection (c'est plus crados, ça fait plus
d'échanges avec le serveur).

Tu peux utiliser un code du genre :

<SCRIPT LANGUAGE="Javascript">
function pageSuiv() {
location.href='http://mon_url';
}
setTimeout("pageSuiv()", 3);
</SCRIPT>
Post by thiebaut olivier
A chaque fois j'ai un already send, mais comme je tente d'utiliser un
modèle MVC avec contrôleur, il est fort probable "qu'il y ait un echo
ou print qui traine" bref une idée.
Sinon théoriquement dans un controlleur, tu n'affiches rien, il n'y a que
la vue qui peut afficher quelque chose.
Si tes echo ou printf sont juste pour du débug, utilise plutôt un logger,
ça règlera ton problème (ça mettra tes messages de debug dans un fichier
au lieu de les renvoyer au navigateur).

Cordialement,
Philippe Le Van
--
Communauté autour du Zend Framework : http://www.z-f.fr
Continuer la lecture sur narkive:
Loading...