Discussion:
SOS debutant : bloque sur header location
(trop ancien pour répondre)
Ben74
2007-07-22 15:18:22 UTC
Permalink
Bonjour à tous

je débute en php et je dois, suite à un formulaire d'authentification,
rediriger un visiteur vers une URL
j'ai essayé avec header("location:....) et ça ne fonctionne pas
voici le code


// connexion à la base de données
$db = mysql_connect ('xxxx' , 'yyyyy' , 'zzzzz') or die ( ' Erreur de
connexion '.mysql_error());
mysql_select_db('uuuuuuuu', $db) or die('Erreur de
sélection'.mysql_error());

// vérification des données du formulaire
$sql = "Select * from Users where NOM_US='".$nom."' and PRE_US='".
$prenom."'";
$result = mysql_query($sql) or die("Query failed");
$valide = false;
while ($line = mysql_fetch_assoc($result))
{
$valide = true;
}
mysql_free_result($result);
if($valide == true)
{
////////////////// c'est là que ça plante ////////////////////////
header("Location: test.php");
}
else
{
echo("BAD CHOICE !");
return false;
}
/ Fermeture de la connexion
mysql_close($db);


pouvez vous m'indiquer une piste ?
merci d'avance

BV
Emmanuel Petit
2007-07-23 08:21:05 UTC
Permalink
Il est préférable de créer un buffer de sortie pour utiliser la fonction
header. En effet, il ne faut pas que des données aient été déjà envoyés
au navigateur par le script.
pour ce faire, voici la méthode que j'utilise:
En toutdébut de votre page php utilisez la fonction suivante:

//début de session
ob_start();

dans votre script à la ligne précédent votre function header :
//rediriger
ob_end_clean();
Post by Ben74
header("Location: test.php");
Enfin a la fin de votre script :

//vider le buffer
ob_end_flush();

Ca marche très bien dans tous mes scripts, mais si vous n'avez pas
compris, faites le moi savoir.
Bonne chance....
Ben74
2007-07-23 12:51:22 UTC
Permalink
Post by Emmanuel Petit
Il est préférable de créer un buffer de sortie pour utiliser la fonction
header. En effet, il ne faut pas que des données aient été déjà envoyés
au navigateur par le script.
//début de session
ob_start();
//rediriger
ob_end_clean();
Post by Ben74
header("Location: test.php");
//vider le buffer
ob_end_flush();
Ca marche très bien dans tous mes scripts, mais si vous n'avez pas
compris, faites le moi savoir.
Bonne chance....
je vais essayer ! même si j'avoue ne pas tout saisir, je vais
également aller regarder l'aide PHP pour en savoir plus
sur la notion de buffer
merci bq pour votre reponse, je vous tiens au courant pour vous dire
si cela fonctionne
Ben74
2007-07-23 15:17:35 UTC
Permalink
Post by Emmanuel Petit
Il est préférable de créer un buffer de sortie pour utiliser la fonction
header. En effet, il ne faut pas que des données aient été déjà envoyés
au navigateur par le script.
//début de session
ob_start();
//rediriger
ob_end_clean();
Post by Ben74
header("Location: test.php");
//vider le buffer
ob_end_flush();
Ca marche très bien dans tous mes scripts, mais si vous n'avez pas
compris, faites le moi savoir.
Bonne chance....
J'ai essayé mais ca ne marche pas
toujours une page blanche
Olivier Miakinen
2007-07-23 08:36:15 UTC
Permalink
Post by Ben74
je débute en php et je dois, suite à un formulaire d'authentification,
rediriger un visiteur vers une URL
j'ai essayé avec header("location:....) et ça ne fonctionne pas
Ah, « ça ne fonctionne pas ». Mais parmi les zillions de façons
possibles de « ne pas fonctionner », quelle est la tienne ?

Par exemple :
1) Rien ne s'affiche.
2) Tu as un message d'erreur (lequel ?).
3) Les « é » sont transformés en « é ».
4) Ton écran explose.
5) Tes toasts sont trop grillés.
6) Le script tourne pendant une minute sans résultat.
7) Ta femme t'a quitté.
8) etc.

Vu que tu utilises la fonction header (avec comme paramètre un truc
interdit par la noreme HTTP, mais passons...), as-tu déjà lu la FAQ ?

http://faqfclphp.free.fr/#rub2.11
http://faqfclphp.free.fr/#rub2.12
Post by Ben74
voici le code
Sans une description de la façon dont « ça ne fonctionne pas », c'est un
peu inutile.
Ben74
2007-07-23 12:51:22 UTC
Permalink
Post by Olivier Miakinen
Post by Ben74
je débute en php et je dois, suite à un formulaire d'authentification,
rediriger un visiteur vers une URL
j'ai essayé avec header("location:....) et ça ne fonctionne pas
Ah, « ça ne fonctionne pas ». Mais parmi les zillions de façons
possibles de « ne pas fonctionner », quelle est la tienne ?
1) Rien ne s'affiche.
2) Tu as un message d'erreur (lequel ?).
3) Les « é » sont transformés en « é ».
4) Ton écran explose.
5) Tes toasts sont trop grillés.
6) Le script tourne pendant une minute sans résultat.
7) Ta femme t'a quitté.
8) etc.
Vu que tu utilises la fonction header (avec comme paramètre un truc
interdit par la noreme HTTP, mais passons...), as-tu déjà lu la FAQ ?
http://faqfclphp.free.fr/#rub2.11http://faqfclphp.free.fr/#rub2.12
Post by Ben74
voici le code
Sans une description de la façon dont « ça ne fonctionne pas », c'est un
peu inutile.
Bonjour
j'aime le coté sarcastique du message....
quand je dis que ca ne fonctionne pas c'est que j'ai un écran vide
maintenant concernant l'interdiction et la norme, je débute, je sais
que j'ai encore
pleind e choses à lire et à découvrir, mais l'euphorie du débutant à
fait que je me suis
lancé sur des lignes de codes pour tester
désolé de ne pas respecter les cadres et les standards

BV
Olivier Miakinen
2007-07-23 15:17:35 UTC
Permalink
Post by Ben74
Post by Olivier Miakinen
Ah, « ça ne fonctionne pas ». Mais parmi les zillions de façons
possibles de « ne pas fonctionner », quelle est la tienne ?
j'aime le coté sarcastique du message....
;-)
Post by Ben74
quand je dis que ca ne fonctionne pas c'est que j'ai un écran vide
C'est déjà une indication, et même plusieurs :
- tu n'as pas de message d'erreur ;
- et le navigateur n'affiche rien.

Mais même dans ce cas là tu devrais commencer par regarder le code HTML
généré (View/Page source) car il y a sûrement des choses à voir.
Post by Ben74
maintenant concernant l'interdiction et la norme, je débute, je sais
que j'ai encore
pleind e choses à lire et à découvrir, mais l'euphorie du débutant à
fait que je me suis
lancé sur des lignes de codes pour tester
désolé de ne pas respecter les cadres et les standards
En quelques mots, le header("Location: ...") ne devrais jamais servir à
rien d'autre qu'à rediriger d'un site vers un autres, et pas entre deux
pages du même site. D'ailleurs il devrait toujours y avoir une URL
absolue (du genre http://www.example.com/test.html) et jamais une URL
relative (telle que test.html).

Par ailleurs, merci de ne rien citer de plus que ce qui est utile quand
tu réponds à un message sur usenet. Quelques lignes de citations en
plus, et ton article aurait été refusé par la modération pour citation
excessive.

Cf. <http://www.faqs.org/faqs/fr/usenet/repondre-sur-usenet/>.
Bruno Desthuilliers
2007-07-23 18:09:01 UTC
Permalink
Olivier Miakinen a écrit :
(snip)
Post by Olivier Miakinen
En quelques mots, le header("Location: ...") ne devrais jamais servir à
rien d'autre qu'à rediriger d'un site vers un autres, et pas entre deux
pages du même site.
Chapitre et verset, s'il te plait ?

Moi, ce que je vois dans la rcf, c'est:

14.30 Location

The Location response-header field is used to redirect the recipient
to a location other than the Request-URI for completion of the
request or identification of a new resource. For 201 (Created)
responses, the Location is that of the new resource which was created
by the request. For 3xx responses, the location SHOULD indicate the
server's preferred URI for automatic redirection to the resource. The
field value consists of a single absolute URI.

Location = "Location" ":" absoluteURI

Qui ne dit en rien que l'URI doivent appartenir à un autre domaine - au
contraire, cf la partie sur le code 201, ainsi que cet autre extrait:

9.5 POST
(...)
If a resource has been created on the origin server, the response
SHOULD be 201 (Created) and contain an entity which describes the
status of the request and refers to the new resource, and a Location
header (see section 14.30).


qui pour ce que j'en comprend implique au contraire qu'il est non
seulement autorisé mais dans certaines circonstances *recommandé*
d'utiliser un header Location avec une URI pointant sur le même domaine.

nb : http://www.faqs.org/rfcs/rfc2616
Post by Olivier Miakinen
D'ailleurs il devrait toujours y avoir une URL
absolue (du genre http://www.example.com/test.html) et jamais une URL
relative (telle que test.html).
Là par contre on est d'accord. C'est d'ailleurs documenté dans la doc PHP.

http://fr.php.net/manual/en/function.header.php
Olivier Miakinen
2007-07-23 18:56:06 UTC
Permalink
Post by Bruno Desthuilliers
(snip)
Post by Olivier Miakinen
En quelques mots, le header("Location: ...") ne devrais jamais servir à
rien d'autre qu'à rediriger d'un site vers un autres, et pas entre deux
pages du même site.
Chapitre et verset, s'il te plait ?
« La vie trépidante des livreurs de machine à laver », par John Gallet.

Quelques numéros de chapitre et verset se trouvent ici :
http://groups.google.fr/groups/search?q=livreur+author%3AGallet
Post by Bruno Desthuilliers
[...]
qui pour ce que j'en comprend implique au contraire qu'il est non
seulement autorisé mais dans certaines circonstances *recommandé*
d'utiliser un header Location avec une URI pointant sur le même domaine.
J'avoue que j'ai fait un raccourci. Mais je ne me sentais pas le
courage de me lancer dans de longs développements au sujet de ces
cas de requêtes POST, vu que je suis persuadé qu'un débutant complet
tel que Ben74 (il le dit lui-même) n'est *pas* dans ce cas de figure.

Le jour où il sera suffisamment avancé pour être dans le cas que
tu soulignes, alors il aura lui-même compris les tenants et les
aboutissants du header("Location: ...") et il ne servira plus à rien
de le mettre en garde contre le « header("Location: test.php"); » !
Kali
2007-07-24 08:39:15 UTC
Permalink
Post by Bruno Desthuilliers
qui pour ce que j'en comprend implique au contraire qu'il est non
seulement autorisé mais dans certaines circonstances *recommandé*
d'utiliser un header Location avec une URI pointant sur le même domaine.
Bonjour !

Heu, pouvez-vous m'expliquer la différence entre une URL et une URI
s'il-vous-plaît ? Car j'ai beau regarder sur Google, j'avoue ne pas
comprendre le truc, bien qu'il y ait l'air d'y avoir une différence non
négligeable....

Je vous remercie d'avance ;-)
Bruno Desthuilliers
2007-07-24 09:20:53 UTC
Permalink
Post by Olivier Miakinen
Post by Bruno Desthuilliers
(snip)
Post by Olivier Miakinen
En quelques mots, le header("Location: ...") ne devrais jamais servir à
rien d'autre qu'à rediriger d'un site vers un autres, et pas entre deux
pages du même site.
Chapitre et verset, s'il te plait ?
« La vie trépidante des livreurs de machine à laver », par John Gallet.
http://groups.google.fr/groups/search?q=livreur+author%3AGallet
Tu m'excusera, mais entre les opinions personnelles de John (avec tout
le respect que j'ai pour lui) et la RCF, il y a une marge. La référence,
jusqu'à preuve du contraire, c'est la RFC.

(snip)
Post by Olivier Miakinen
Post by Bruno Desthuilliers
qui pour ce que j'en comprend implique au contraire qu'il est non
seulement autorisé mais dans certaines circonstances *recommandé*
d'utiliser un header Location avec une URI pointant sur le même domaine.
J'avoue que j'ai fait un raccourci. Mais je ne me sentais pas le
courage de me lancer dans de longs développements au sujet de ces
cas de requêtes POST,
Ce qui n'était pas forcément nécessaire.
<OP>
Outre ton problème effectif (
Post by Olivier Miakinen
vu que je suis persuadé qu'un débutant complet
tel que Ben74 (il le dit lui-même) n'est *pas* dans ce cas de figure.
Non, il est dans le cas de figure d'une redirection après un login. Que
la redirection soit ou non la meilleure solution dans ce cas est une
question ouverte - et à laquelle il n'y a probablement pas de réponse
absolue puisque ça dépend aussi de l'architecture applicative. En tout
état de cause, ce n'est AMHA pas une raison (bien au contraire) pour lui
présenter comme vérité d'évangile un avis personnel qui contredit le
standard.

mes deux centimes.
Bruno Desthuilliers
2007-07-24 11:33:01 UTC
Permalink
Bruno Desthuilliers a écrit :
(snip)
Post by Bruno Desthuilliers
<OP>
Outre ton problème effectif (
Désolé, pas fait le ménage avant de poster...
(snip)
Thief13
2007-07-24 11:33:02 UTC
Permalink
Post by Bruno Desthuilliers
Non, il est dans le cas de figure d'une redirection après un login. Que
la redirection soit ou non la meilleure solution dans ce cas est une
question ouverte - et à laquelle il n'y a probablement pas de réponse
absolue puisque ça dépend aussi de l'architecture applicative. En tout
état de cause, ce n'est AMHA pas une raison (bien au contraire) pour lui
présenter comme vérité d'évangile un avis personnel qui contredit le
standard.
Pour ma part, je n'ais toujours pas compris pourquoi ce serait si mal,
comme je le lit si souvent sur ce newsgroup, d'utiliser un header
location apres un login (surtout que apres avoir lu la RFC, et toutes
les doc la dessus, je n'ai rien trouvé de consistant qui aurrais put
l'expliquer), donc j'irrais plutot dans le sens de Bruno.

Que l'adresse soit absolut : oui
Que l'on utilise pas le header location entres deux pages d'un meme
domaine : pourquoi se priver et se casser la tête à trouver des solution
de remplacement quand on a un outil tres bien qui marche du tonnere !
Bruno Desthuilliers
2007-07-24 15:00:50 UTC
Permalink
Post by Thief13
Post by Bruno Desthuilliers
Non, il est dans le cas de figure d'une redirection après un login. Que
la redirection soit ou non la meilleure solution dans ce cas est une
question ouverte - et à laquelle il n'y a probablement pas de réponse
absolue puisque ça dépend aussi de l'architecture applicative. En tout
état de cause, ce n'est AMHA pas une raison (bien au contraire) pour lui
présenter comme vérité d'évangile un avis personnel qui contredit le
standard.
Pour ma part, je n'ais toujours pas compris pourquoi ce serait si mal,
comme je le lit si souvent sur ce newsgroup, d'utiliser un header
location apres un login
L'idée est que ça fait faire un roundtrip de plus entre le client et le
serveur, qui peut être évité par un include. Il est vrai qu'en RTC bas
débit, ça peut faire une différence sensible pour l'internaute. Il est
vrai aussi que ça charge un peu plus le serveur vu qu'il va devoir gérer
deux connections/requêtes au lieu d'une. Il n'est donc pas
nécessairement idiot d'essayer de restreindre l'utilisation des
redirections quand on peut régler le problème autrement tout en
respectant le protocole HTTP.

D'un autre côté, un redirect ne coûte pas si cher qu'il faille
nécessairement essayer de l'éviter à tout prix - et notoirement quand ça
ne respecte plus l'esprit - sinon la lettre - de la RFC.

mes deux centimes...
Thief13
2007-07-25 10:43:58 UTC
Permalink
Post by Bruno Desthuilliers
L'idée est que ça fait faire un roundtrip de plus entre le client et le
serveur, qui peut être évité par un include. Il est vrai qu'en RTC bas
débit, ça peut faire une différence sensible pour l'internaute. Il est
vrai aussi que ça charge un peu plus le serveur vu qu'il va devoir gérer
deux connections/requêtes au lieu d'une. Il n'est donc pas
nécessairement idiot d'essayer de restreindre l'utilisation des
redirections quand on peut régler le problème autrement tout en
respectant le protocole HTTP.
Oui, donc je ne voi vraimnet pas le probleme de l'utiliser apres un
login par exemple : franchement, quand on navigue sur un site, on ne se
logue pas à chaque page, et à partire du moment ou on utilise une
adresse absolue, pas de pb avec la RFC, donc...
John GALLET
2007-08-03 09:35:19 UTC
Permalink
Bonjour,
Post by Bruno Desthuilliers
Post by Thief13
Pour ma part, je n'ais toujours pas compris pourquoi ce serait si mal,
comme je le lit si souvent sur ce newsgroup, d'utiliser un header
location apres un login
L'idée est que ça fait faire un roundtrip de plus entre le client et le
serveur, qui peut être évité par un include. Il est vrai qu'en RTC bas
débit, ça peut faire une différence sensible pour l'internaute. Il est
vrai aussi que ça charge un peu plus le serveur vu qu'il va devoir gérer
deux connections/requêtes au lieu d'une.
En gros, on bouffe quand même deux fois l'intégralité des ressources.
Marrant quand même que ça ne gêne personne, une perte en ressources de
100%... alors qu'ensuite on va voir les mêmes (pas toi Bruno) nous
rabâcher les oreilles que echo va plus ou moins vite que print et que
parser ''.$foo.'' va plus ou moins vite que "$foo"... pour gagner 10e-3 ou
10e-4% de perfs.

J'ajouterai aussi des effets de bord à la con, par exemple le fait que ça
force un GET (ce qui en soit n'a pas d'importance mais par exemple un
Location:....php?donnee_confidentielle=abc sera écrit dans les logs http).
Voire la création inutile d'un process de plus pour gérer la requête parce
que pas assez de spare.

Ce qui me gêne le plus étant le nombre affolant de cas où on a:

a.php
[verifications diverses, c'est bien]
[si tout va bien : Location...b.php]
[sinon Location:... error.php]

avec dans b.php
[aucune verification, vas-y mon gars, je reçois n'importe quoi j'y vais]
Post by Bruno Desthuilliers
Il n'est donc pas nécessairement idiot d'essayer de restreindre
l'utilisation des redirections quand on peut régler le problème
autrement tout en respectant le protocole HTTP.
Moi ce qui me gêne surtout, c'est qu'il serait quand même assez tordu de
ne *jamais appeler directement la méthode d'un objet* et de
systématiquement passer par deux autres objets dans deux threads séparés
qui ferait cet appel après sérialisation. Je ne parle pas de surcharge de
méthode, je parle d'un truc du genre:

au lieu de
$objet_destination->méthode($arg1,$arg2);
on ferait *systématiquement*

$central->call('objet_destination', 'méthode', 'arg1','arg2');

avec introspection et sérialisation de l'instance de l'objet
destination qui sera relu en asynchrone par un autre thread chargé de
désérialiser et d'exécuter... C'est en gros le principe de SOAP ou même de
CORBA (encore que) mais c'est pas fait pour tourner en local.

C'est une MALC qui parlera peut-être plus (ou moins) que celle des
livreurs de machine à laver, mais c'est similaire. Au lieu d'exécuter
directement dès la première requête http la bonne routine (procédurale ou
OO, là n'est pas la question, via require ou non, la n'est pas la
question) on va passer par un intermédiaire, distant (le client) pour lui
demander d'appeler le bon code avec les bons arguments. Moi je trouve ça
complètement délirant *dans le principe même* sur un même
serveur/environnement sur un même protocole. Si on passe de http à https,
pas le choix, si on redirige vers un autre environnement inaccessible
localement, peu de choix ou méthodes similaires de toutes façons (genre
xml-rpc).
Post by Bruno Desthuilliers
D'un autre côté, un redirect ne coûte pas si cher qu'il faille
nécessairement essayer de l'éviter à tout prix
Comme toujours, l'essentiel est de comprendre les avantages et
inconvénients de chaque méthode. Je suis parfaitement d'accord sur le fait
qu'on peut en avoir deux ou trois qui traînent, mais le vrai danger
commence quand on l'élève en méthode standard de programmation pour tout
sans en comprendre les impacts.

JG
Bruno Desthuilliers
2007-08-07 21:46:16 UTC
Permalink
Post by John GALLET
Bonjour,
Post by Bruno Desthuilliers
Post by Thief13
Pour ma part, je n'ais toujours pas compris pourquoi ce serait si mal,
comme je le lit si souvent sur ce newsgroup, d'utiliser un header
location apres un login
L'idée est que ça fait faire un roundtrip de plus entre le client et le
serveur, qui peut être évité par un include. Il est vrai qu'en RTC bas
débit, ça peut faire une différence sensible pour l'internaute. Il est
vrai aussi que ça charge un peu plus le serveur vu qu'il va devoir gérer
deux connections/requêtes au lieu d'une.
En gros, on bouffe quand même deux fois l'intégralité des ressources.
Marrant quand même que ça ne gêne personne, une perte en ressources de
100%...
A moins que tu n'ait des traitements monstrueux pour *chaque* requête
(auquel cas soit il y a quelque chose à revoir de toutes façons, soit le
modèle d'exécution de PHP n'est peut-être pas approprié), la consomation
de ressources n'est quand même pas si monstrueuse que ça. Honnêtement,
il y a aussi d'autres façons de gérer les problèmes de montée en charge.

Accessoirement, dans le cas du traitement d'une requête POST, la faire
suivre d'un redirect est ce qui reste le plus proche des specs HTTP.
Post by John GALLET
alors qu'ensuite on va voir les mêmes (pas toi Bruno) nous
rabâcher les oreilles que echo va plus ou moins vite que print et que
parser ''.$foo.'' va plus ou moins vite que "$foo"... pour gagner 10e-3 ou
10e-4% de perfs.
Lol !-)

Non, en effet, je ne me soucie pas personnellement de ce genre de
(hum...) "optimisation". Généralement, ce n'est pas à ce niveau là qu'on
gagne le plus... (algorithmes et structures de données anyone ?)
Post by John GALLET
J'ajouterai aussi des effets de bord à la con, par exemple le fait que ça
force un GET (ce qui en soit n'a pas d'importance mais par exemple un
Location:....php?donnee_confidentielle=abc sera écrit dans les logs http).
Léger, ton argument, John. Les données confidentielle, soit tu les
stocke en session, soit - si tu dois vraiment les passer dans une
requête (et là, que ce soit en post ou en get ne change pas grand chose)
- tu utilises une connection sécurisée.
Post by John GALLET
Voire la création inutile d'un process de plus pour gérer la requête parce
que pas assez de spare.
Si le serveur n'est pas assez puissant => changer de serveur. Ok, ce
n'est pas une excuse pour programmer comme un goret, mais si par
ailleurs ton serveur est déjà chargé à ce point (et partant du principe
que les redirects sont utilisés à bon escient, dois-je le préciser), ce
n'est pas une ou deux (pseudo) micro-optimisations qui solutionneront
durablement le problème. Mieux vaut garder un code propre et maintenable
et investir dans un serveur sérieux (ou répartir sur quelques serveurs).
Enfin, AMHA et selon mon humble expérience.
Post by John GALLET
a.php
[verifications diverses, c'est bien]
[si tout va bien : Location...b.php]
[sinon Location:... error.php]
avec dans b.php
[aucune verification, vas-y mon gars, je reçois n'importe quoi j'y vais]
Heu... Tu vois souvent du code comme ça, toi ?

En tout état de cause, ce n'est pas le bon emploi des redirections.
Outre le cas évident (la ressource a déménagé), le cas usuel (après un
post qui a réussi), et un ou deux cas périphériques (par exemple gestion
des login, avec utilisation de sessions of course) qui sont parfois peu
ou prou imposés par une archi existente (framework, appli 'pluggable'
etc), je ne vois pas trop de raison d'utiliser un redirect, et
certainement pas celui que tu cites et que je n'ai pour ma part jamais vu.

(snip)
Post by John GALLET
Moi ce qui me gêne surtout, c'est qu'il serait quand même assez tordu de
ne *jamais appeler directement la méthode d'un objet* et de
systématiquement passer par deux autres objets dans deux threads séparés
qui ferait cet appel après sérialisation. Je ne parle pas de surcharge de
au lieu de
$objet_destination->méthode($arg1,$arg2);
on ferait *systématiquement*
$central->call('objet_destination', 'méthode', 'arg1','arg2');
avec introspection et sérialisation de l'instance de l'objet
destination qui sera relu en asynchrone par un autre thread chargé de
désérialiser et d'exécuter...
Tu bosses trop avec des développeurs Java, en ce moment. Je ne vois
qu'eux pour imaginer des monstruosités pareilles !-)

(comment ça je trolle ? Mais non je trolle pas !-)
Post by John GALLET
Post by Bruno Desthuilliers
D'un autre côté, un redirect ne coûte pas si cher qu'il faille
nécessairement essayer de l'éviter à tout prix
Comme toujours, l'essentiel est de comprendre les avantages et
inconvénients de chaque méthode.
indeed
Post by John GALLET
Je suis parfaitement d'accord sur le fait
qu'on peut en avoir deux ou trois qui traînent, mais le vrai danger
commence quand on l'élève en méthode standard de programmation pour tout
sans en comprendre les impacts.
Certes, mais c'est vrai pour *beaucoup* d'autres choses. Combien de
bases SQL avec des index sur des champs booléens, par exemple...
Julien Plee
2007-08-12 11:12:57 UTC
Permalink
Post by John GALLET
Bonjour,
En gros, on bouffe quand même deux fois l'intégralité des ressources.
Marrant quand même que ça ne gêne personne, une perte en ressources de
100%... alors qu'ensuite on va voir les mêmes (pas toi Bruno) nous
rabâcher les oreilles que echo va plus ou moins vite que print et que
parser ''.$foo.'' va plus ou moins vite que "$foo"... pour gagner 10e-3
ou 10e-4% de perfs.
Votre approche ne prend pas du tout en compte la notion des URI. A savoir
donc qu'une ressource spécifique devrait être disponible en un
emplacement spécifique (parfois plusieurs, mais la justification est
rare). L'association *ressource*-*emplacement* permet de gagner
significativement en termes de performances puisqu'elle facilite la mise
en cache des données et on économise du coup tout le traitement de mise
en page. Il est donc faux de prétendre qu'on "bouffe" deux fois
l'intégralité des ressources. Si la conception est bien faite, on
utilisera toutes les ressources nécessaires à la génération au premier
appel, puis on utilisera les traitements mis en cache, ce qui est
parfaitement économe.
Post by John GALLET
J'ajouterai aussi des effets de bord à la con, par exemple le fait que
ça force un GET (ce qui en soit n'a pas d'importance mais par exemple un
Location:....php?donnee_confidentielle=abc sera écrit dans les logs
http). Voire la création inutile d'un process de plus pour gérer la
requête parce que pas assez de spare.
Les effets de bords que vous mentionnez sont aussi provoqués par une
mauvaise conception.
D'une part, si rien ne vous empêche de placer des données confidentielle
dans une requête GET (sauf peut-être la CNIL dans certains cas les plus
grave et si on lui rapporte l'abus), la méthode n'est pas prévue pour et
entre en conflit avec la sécurité du service et des informations
personnelles.

Pour cela, il a été inventé des techniques comme celle du jeton de
validation.
Un service quelconque dirige l'utilisateur vers un service
d'authentification. Le service d'authentification délivre un jeton à
l'utilisateur et le redirige vers le service quelconque avec son jeton.
Le service quelconque note la présence du jeton et contacte le service
d'authentification pour savoir si le jeton est valide, et poursuit son
traitement en fonction.
Utilisation de services spécialisés, pas de transmission de données
personnelles en clair.

J'admet que cette procédure peut être coûteuse, mais elle n'intervient
que pour l'identification du client (assez rarement donc) et elle
respecte l'idée de "1 endroit pour accéder à 1 service", ce qui permet de
déméler les noeuds dans lesquels on peut se prendre le cerveau lorsqu'il
s'agit de modifier l'application existante ou même simplement de corriger
une erreur.

Quand à l'argument de processus créé, que dites vous de ceux qui sont
créés pour générer des pages existantes dans le cache de l'utilisateur,
par le simple manque du concepteur à rendre son service compatible avec
ceux-ci ? A rechercher les gaspillages des autres, on peut aller très
loin sans que les idées reçues ne changent ni même que les concepteurs
revoient leur manière de concevoir...

Cf RFC2616
9.1.1 Safe Methods
15 Security Considerations
15.1.1 Abuse of Server Log Information
15.1.3 Encoding Sensitive Information in URI's
Post by John GALLET
a.php
[verifications diverses, c'est bien]
[si tout va bien : Location...b.php]
[sinon Location:... error.php]
avec dans b.php
[aucune verification, vas-y mon gars, je reçois n'importe quoi j'y vais]
Problème de conception, encore. Si on ne doit pas utiliser une
fonctionnalité parce qu'un groupe de personne ne sait pas l'utiliser, on
n'utilisera plus rien de notre existence.
Ce genre de phénomène n'est donc pas à prendre en compte dans le
développement. Il est plus sage de faire maîtriser les outils et concepts
que de propager la prohibition de ce qui n'est pas interdit.
Si vous ne souhaitez pas le faire, pas de soucis, mais abstenez vous de
la propagande.

Pour la résolution du problème mentionné, cf RFC2616 10.4.4 403 Forbidden
Post by John GALLET
Moi ce qui me gêne surtout, c'est qu'il serait quand même assez tordu de
ne *jamais appeler directement la méthode d'un objet* et de
systématiquement passer par deux autres objets dans deux threads séparés
qui ferait cet appel après sérialisation.
Ca dépend entièrement du contexte... Là n'était pas, d'après moi, le
thème et il serait tout aussi idiot de *toujours appeler directement*.
Les deux actions rediriger et inclure on un sens profondément différent.
Dans le premier cas, on dit "Je ne m'occupe pas de ça, va voir là-bas.",
dans le second, on dit "Oui, je suis habilité à exécuter cette procédure,
un instant s'il vous plaît."
Post by John GALLET
C'est une MALC qui parlera peut-être plus (ou moins) que celle des
livreurs de machine à laver, mais c'est similaire. Au lieu d'exécuter
directement dès la première requête http la bonne routine (procédurale
ou OO, là n'est pas la question, via require ou non, la n'est pas la
question) on va passer par un intermédiaire, distant (le client) pour
lui demander d'appeler le bon code avec les bons arguments. Moi je
trouve ça complètement délirant *dans le principe même* sur un même
serveur/environnement sur un même protocole. Si on passe de http à
https, pas le choix, si on redirige vers un autre environnement
inaccessible localement, peu de choix ou méthodes similaires de toutes
façons (genre xml-rpc).
Je ne comprends pas votre point de vue, et encore moins quelle est la
situation délirante. Le principe client/serveur sert à alléger une
machinerie lourde. Et votre histoire de livreur, je la trouve bien tirée
par les cheveux et vous n'avez même pas remarqué que dans le cas d'un
"include" mal utilisé, votre livreur va percer un trou dans le mur du
voisin chez qui il a sonné pour accéder à l'appartement du voisin chez
qui il devrait livré, sans prendre la peine d'aller sonner à sa porte.
Le livreur s'est trompé, il faut peut-être prendre conscience qu'il a
fait une erreur. Et qui dit erreur, dit mauvais fonctionnement, ce qui
n'est pas normal en développement d'application.
En revanche, le livreur peut très bien être missionné pour laisser sa
machine à laver dans le camion, aller s'informer auprès de la concierge/
voisin pour savoir où se trouve l'appartement à livrer, s'assurer qu'il
peut livrer, retourner dans son camion et finalement se faire chier à
transporter sa machine de 80Kg sachant où et comment la livrer.

Qui voudrait d'un livreur assez taré pour percer les murs des voisins
quand il se plante de porte ? Et que se passe-t-il s'il se plante
carrément d'étage ? il utilise la machine de 80 Kg comme marteau piqueur
dans la mauvaise buanderie pour l'installer plus facilement dans celle du
voisin d'en dessous ?

Un conception, c'est une planification: on ne doit pas procéder dans le
désordre ou alors on fait mal, on perd du temps, des ressources, on
bafoue les règles de courtoisie... et on est toujours débordé ! (clin
d'oeil à votre clin d'oeil sur l'utilisation des ressources)
Post by John GALLET
Comme toujours, l'essentiel est de comprendre les avantages et
inconvénients de chaque méthode. Je suis parfaitement d'accord sur le
fait qu'on peut en avoir deux ou trois qui traînent, mais le vrai danger
commence quand on l'élève en méthode standard de programmation pour tout
sans en comprendre les impacts.
C'est ce qui fait toute la différence entre bonne et mauvaise conception.
Une obsession anti-redirections ne vaut pas mieux qu'une obsession pro-
inclusion. L'essentiel étant de mettre en place un système simple, léger
(par rapport à sa fonction), maintenable, qui ne fait rien de plus que ce
qu'il est censé faire et qui fait bien ce qu'il est censé faire.
Post by John GALLET
JG
Julien
John GALLET
2007-08-12 14:59:17 UTC
Permalink
Bonjour,

NB : vous publiez en UTF-8, attention moult serveurs de news ne
propageront pas vos articles. Là aussi, c'est une différence entre "ce
qu'on peut faire" et " qu'il est normal de faire"...
Post by Julien Plee
Votre approche ne prend pas du tout en compte la notion des URI.
C'est parfaitement exact, et là n'est pas mon propos.
Post by Julien Plee
rare). L'association *ressource*-*emplacement* permet de gagner
significativement en termes de performances puisqu'elle facilite la mise
en cache des données
De manière générale, la mise en cache des données est justement ce que
l'on veut *éviter* quand on fait du web dynamique. Sinon on s'emmerderait
pas à passer des arguments...
Post by Julien Plee
en page. Il est donc faux de prétendre qu'on "bouffe" deux fois
l'intégralité des ressources.
C'est exact, la seule constante de traitement sans overhead, c'est le
traitement qu'on veut exécuter, appelé en direct ou en redirection. Ceci
étant dit, disséquez l'intégralité dialogue socket, que ce soit en
keep-alive ou non, et repointez les ressources consommées sur tous les
éléments du réseau, du client et du serveur. Mettez vous dans un vrai cas
de site professionnel qui tourne, avec un loadbalanceur sur 7 ou 8
machines (bêtes de course qui coûtent cher à acheter et à héberger, je ne
parle pas de 486 d'occaz), et qui doit générer plusieurs milliers de pages
de contenu par jour, toutes dynamiques à 100%. Vous allez voir, si vos
header Location bouffent pas deux fois les ressources...
Post by Julien Plee
Si la conception est bien faite, on utilisera toutes les ressources
nécessaires à la génération au premier appel, puis on utilisera les
traitements mis en cache, ce qui est parfaitement économe.
Quel cache ? A part le SGA ou équivalent avec des requêtes SQL prébindées,
il n'y a aucun cache existant.
Post by Julien Plee
Les effets de bords que vous mentionnez sont aussi provoqués par une
mauvaise conception.
J'ai pas dit le contraire. Je ne fais que signaler la situation que je
constate en audits quotidiens et qui est dangereuse.
Post by Julien Plee
D'une part, si rien ne vous empêche de placer des données confidentielle
dans une requête GET (sauf peut-être la CNIL dans certains cas les plus
grave et si on lui rapporte l'abus), la méthode n'est pas prévue pour et
entre en conflit avec la sécurité du service et des informations
personnelles.
Là n'est pas la question. Si on n'écrit pas ces informations dans les
logs, personne qui aura a posteriori un accès anormal à ces logs ne pourra
la lire, c'est aussi bête que ça. C'est l'un des rares critères de choix
de transmission de GET vs POST (mais là aussi je sens qu'on va encore
repartir pour un tour, ça me fatigue d'avance).
Post by Julien Plee
Utilisation de services spécialisés, pas de transmission de données
personnelles en clair.
Quand il faut transmettre un login/pass ou numéro de carte bleue, il y a
bien un moment où il transite. Si le crétin de développeur qui le gère
fait un GET, volontaire ou non, ces informations seront stockées en clair
dans un log. Donc qu'on réduise au maximum le nombre de fois où ça
transite, pourquoi pas (ça amène d'autres problèmes, sur la validité du
jeton en question et du session fixation par exemple) mais il faut bien
amorcer la pompe. Et il n'y a pas que ça comme données confidentielles,
loin de là, toute donnée personnelle (coordonnées postales ou
électroniques, etc.) en font partie.
Post by Julien Plee
J'admet que cette procédure peut être coûteuse, mais elle n'intervient
que pour l'identification du client (assez rarement donc)
Rarement ? Juste sur chaque page demandée pour vérifier les droits
d'accès dans toutes les applications qui gèrent du contenu, d'une manière
ou d'une autre.
Post by Julien Plee
Quand à l'argument de processus créé, que dites vous de ceux qui sont
créés pour générer des pages existantes dans le cache de l'utilisateur,
Leur quantité est strictement égale à zéro sur une application dynamique,
ou alors justement on a un problème. C'est à tel point qu'on est parfois
obligés de rajouter un compteur bidon ou aléatoire dans les requêtes http
pour ne pas être emmerdés par ces crétins de navigateurs qui ne font pas
la requête de nouveau même quand on leur indique gentiment.
Post by Julien Plee
Cf RFC2616
Je l'ai dit et je le redis: je me tamponne complètement de ce qu'il est
possible de faire, moi dans mon métier, je fais de l'audit de code au
quotidien et ce que je vois en pratique, c'est que 98% des utilisations de
header Location foutent le bordel à un endroit ou à un autre de la chaîne.
C'est tout.
Post by Julien Plee
Post by John GALLET
[aucune verification, vas-y mon gars, je reçois n'importe quoi j'y vais]
Problème de conception, encore.
Je n'ai pas dit le contraire.
Post by Julien Plee
Si on ne doit pas utiliser une fonctionnalité parce qu'un groupe de
personne ne sait pas l'utiliser, on
n'utilisera plus rien de notre existence.
Je n'ai pas dit le contraire. Le vrai problème c'est que à élever
l'utilisation d'une *fonctionnalité* au rang de *méthode de développement*
ça va nécessairement créer des problème chez les gens qui n'en ont pas
compris tous les risques.
Post by Julien Plee
Ce genre de phénomène n'est donc pas à prendre en compte dans le
développement.
Vous parlez de qui par "phénomène(s)" ? ;-) La théorisation et
l'intellectualisation, c'est beau, mais faut revenir sur terre de temps en
temps. Le niveau moyen de l'intégrateur html-php est de plus en plus
faible. Sécurité ? connais pas. Socket ? Oui j'ai mis mes chaussettes, il
fait froid. Performances ? Boah, on s'en fout, maintenant la puissance...
ah oui quand tu m'en parles, c'est vrai on a des machines qui rament à
mort et des clients pas contents parce qu'ils n'arrivent pas à utiliser le
service, mais c'est pas de ma faute hein ?

Bref, je parle de la *vraie vie*, pas des belles théories.
Post by Julien Plee
Si vous ne souhaitez pas le faire, pas de soucis, mais abstenez vous de
la propagande.
Je vous renvoie le compliment: si vous vous estimez suffisement maître de
la situation pour le faire, faites le, mais n'entraînez pas avec vous la
foultitude de gens qui ne le sont absolument pas.
Post by Julien Plee
Pour la résolution du problème mentionné, cf RFC2616 10.4.4 403 Forbidden
ROTFL ! La page b.php est nécessairement publique !
Post by Julien Plee
Post by John GALLET
Moi ce qui me gêne surtout, c'est qu'il serait quand même assez tordu de
ne *jamais appeler directement la méthode d'un objet* et de
systématiquement passer par deux autres objets dans deux threads séparés
qui ferait cet appel après sérialisation.
Ca dépend entièrement du contexte... Là n'était pas, d'après moi, le
thème et il serait tout aussi idiot de *toujours appeler directement*.
Contexte: n'importe quelle application en C/C++/Java fonctionnant sur une
machine physique unique en multi-tâche.
Post by Julien Plee
Les deux actions rediriger et inclure on un sens profondément différent.
Dans le premier cas, on dit "Je ne m'occupe pas de ça, va voir là-bas.",
Non, pas "vas voir là-bas", justement. Vas voir là-bas, c'est juste passer
chez le voisin, dans la pièce d'a côté, c'est une exécution immédiate.
header Location, ce n'est pas passer dans la pièce d'a côté, c'est
commencer par redescendre les 10 étages à pied, revenir au rez de chaussée
regarder le plan des locaux, et remonter les 10 étages à pieds pour
revenir à côté. Si vous n'êtes pas capable de comprendre que la belle
théorie des RFCs et tout la bazar implique ça et donc des *gros* problèmes
de performances, c'est votre problème.
Post by Julien Plee
dans le second, on dit "Oui, je suis habilité à exécuter cette procédure,
un instant s'il vous plaît."
Ou tout simplement : je passer le bébé à celui qui est habilité.

Autre MALC: quand on me balade de service en service au téléphone, ça me
broute qu'on me passe de poste en poste, mais ça me brouterait encore plus
si on disait systématiquement "voici le numéro qu'il faut rappeler
immédiatement".
Post by Julien Plee
Je ne comprends pas votre point de vue,
Oui ça je l'avais compris.
Post by Julien Plee
et encore moins quelle est la situation délirante. Le principe
client/serveur sert à alléger une machinerie lourde.
Euh... Là ça frise le ridicule. Vous parlez de ce qu'on fait avec un
terminal VT-100, d'un deux tiers écrit en Delphi, ou d'un trois tiers sur
support http ? Méfiez vous, la réponse sera pas la même.
Post by Julien Plee
Et votre histoire de livreur, je la trouve bien tirée
par les cheveux et vous n'avez même pas remarqué que dans le cas d'un
"include" mal utilisé, votre livreur va percer un trou dans le mur du
voisin chez qui il a sonné pour accéder à l'appartement du voisin chez
qui il devrait livré, sans prendre la peine d'aller sonner à sa porte.
Et en cas d'erreur dans le header Location ça se passera mieux peut-être ?
Arrêtons les conneries, quand on dit inclusion, on peut (?) avoir
l'intelligence de généraliser à "exécution immédiate de code". Donc
évidemment, si le développeur appelle destroy() à la place d'update() on
va pas aller bien loin, mais que ce code soit appelé directement ou après
ping-pong inutile, ça changera rien au problème.
Post by Julien Plee
Un conception, c'est une planification: on ne doit pas procéder dans le
désordre ou alors on fait mal, on perd du temps, des ressources, on
bafoue les règles de courtoisie...
Oui et bien vous allez y retourner à votre con-ception, et le jour où vous
aurez envie de comprendre pourquoi votre bouzin est ras la gueule et ne
répond plus, je vous expliquerai la vraie vie.

Vous avez raison, la belle théorie vous y autorise plus qu'amplement. Dans
la pratique, ça fout le bordel, EOT. Maintenant que vous êtes averti (et
que donc vous valez deux), vous faites ce que vous en voulez, moi je
retourne bosser.

a++;
JG

Olivier Miakinen
2007-07-25 12:36:09 UTC
Permalink
Post by Bruno Desthuilliers
Non, il est dans le cas de figure d'une redirection après un login.
Je te dois toutes mes excuses, et à Ben74 aussi, car je n'avais pas vu
ça. Il y a probablement des données de session qui sont passées d'un
script à l'autres, mais comme cette partie du code n'est pas recopiée
dans l'exemple je n'y avais pas pensé.
Post by Bruno Desthuilliers
Ces redirections, sont uniquement ( et strictement ) destinées à
m'affranchir de la limitation imposée par l'hébergeur ( je suis en mutu,
nul n'est parfait... ), quant au délai limite d'exécution d'un script
PHP ( 22 secondes pour l'hébergeur Sivit, ce qui est très peu... ).
[...]
Vous me direz: les include( ) font celà. Oui, mais quand on inclut un
script dans un autre, le script incluant les autres scripts, est soumis
à cette limitation de 22 secondes... Pas faisable donc.
Oui, c'est aussi un cas de figure compréhensible. Cela dit, outre la
possibilité de chercher un autre hébergeur, j'essaierais de négocier
avec lui un délai un peu plus long. Ou bien d'essayer de réduire la
durée des requêtes si c'était possible, par exemple en réorganisant la
base de données -- mais ce n'est pas forcément possible.
Bruno Desthuilliers
2007-07-25 14:58:43 UTC
Permalink
Olivier Miakinen a écrit :
(snip)
Post by Olivier Miakinen
Post by Jean-Francois Ortolo
Ces redirections, sont uniquement ( et strictement ) destinées à
m'affranchir de la limitation imposée par l'hébergeur ( je suis en mutu,
nul n'est parfait... ), quant au délai limite d'exécution d'un script
PHP ( 22 secondes pour l'hébergeur Sivit, ce qui est très peu... ).
[...]
Vous me direz: les include( ) font celà. Oui, mais quand on inclut un
script dans un autre, le script incluant les autres scripts, est soumis
à cette limitation de 22 secondes... Pas faisable donc.
Oui, c'est aussi un cas de figure compréhensible.
Disons que c'est un contournement... qui - pour qui n'en connait pas la
cause - sent un peu le WTF.
Post by Olivier Miakinen
Cela dit, outre la
possibilité de chercher un autre hébergeur, j'essaierais de négocier
avec lui un délai un peu plus long.
Le défaut est de 30 secondes.
Post by Olivier Miakinen
Ou bien d'essayer de réduire la
durée des requêtes si c'était possible, par exemple en réorganisant la
base de données -- mais ce n'est pas forcément possible.
PAQJS, le temps passé sur des appels bloquants (streams, appels systemes
etc) n'est pas compris dans cette limite. Je n'ai pas vérifié
directement, mais j'aurais tendance à penser qu'il en est de même pour
un accès DB. Si c'est bien le cas, c'est au niveau des autres
traitements (ceux effectués par le/les scripts) qu'il faudrait
intervenir - si c'est possible of course.
Olivier Miakinen
2007-07-25 21:05:04 UTC
Permalink
Post by Bruno Desthuilliers
Post by Olivier Miakinen
Ou bien d'essayer de réduire la
durée des requêtes si c'était possible, par exemple en réorganisant la
base de données -- mais ce n'est pas forcément possible.
PAQJS, le temps passé sur des appels bloquants (streams, appels systemes
etc) n'est pas compris dans cette limite. Je n'ai pas vérifié
directement, mais j'aurais tendance à penser qu'il en est de même pour
un accès DB. Si c'est bien le cas, c'est au niveau des autres
traitements (ceux effectués par le/les scripts) qu'il faudrait
intervenir - si c'est possible of course.
Raison de plus pour regarder si, par hasard, il n'y aurait pas des
traitements (filtres, tris, comparaisons, etc.) qui sont faits en PHP
alors qu'ils seraient réalisés beaucoup plus efficacement par le SGBD.
Jean-Francois Ortolo
2007-07-24 11:33:02 UTC
Permalink
Post by Olivier Miakinen
Post by Bruno Desthuilliers
(snip)
Post by Olivier Miakinen
En quelques mots, le header("Location: ...") ne devrais jamais servir à
rien d'autre qu'à rediriger d'un site vers un autres, et pas entre deux
pages du même site.
Chapitre et verset, s'il te plait ?
« La vie trépidante des livreurs de machine à laver », par John Gallet.
http://groups.google.fr/groups/search?q=livreur+author%3AGallet
Bonjour Monsieur

Question qui se pose (durement) pour moi (mon site, voir signature):

Sur mon site, je me sers abondamment des header("Location: ") pour
rediriger de scripts vers un autre script.

Ces redirections, sont uniquement ( et strictement ) destinées à
m'affranchir de la limitation imposée par l'hébergeur ( je suis en mutu,
nul n'est parfait... ), quant au délai limite d'exécution d'un script
PHP ( 22 secondes pour l'hébergeur Sivit, ce qui est très peu... ).

Les durées d'exécution de mes scripts, en une seule transaction, sont
bien supérieures à 22 secondes, de l'ordre parfois ( rarement je
l'admet... ) de une minute, en tout cas, il m'est strictement impossible
de faire autre chose que des redirections, ne serait-ce que pour les
erreurs, justement pour dépassement de délai, synchronisation de
processus concurrents, etc... )

Vous me direz: les include( ) font celà. Oui, mais quand on inclut un
script dans un autre, le script incluant les autres scripts, est soumis
à cette limitation de 22 secondes... Pas faisable donc.

En d'autres termes, qu'y a-t-il de plus logique, pour s'affranchir de
la limitation de délai, que de procéder en faisant plusieurs requêtes
HTTP ?

Or, poursuivre un même processus en faisant plusieurs requêtes HTTP,
ce n'est possible qu'avec header...

Si vous avez d'autres solutions pour ce problème de délai, que les
header, merci beaucoup de me le dire, je serais très très heureux de
faire une programmation "dans les normes", surtout que j'ai déjà lu
quelques écrits de Monsieur John Gallet, qui est très très compétent, et
dont les conseils sont excellents à suivre.

Merci beaucoup de votre réponse.

Bien à vous.

Amicalement.

Jean-François Ortolo
--
Visitez mon site gratuit donnant des Statistiques
et des Historiques Graphiques sur les Courses de Chevaux:
http://www.ortolojf-courses.com
Julien Plee
2007-08-12 11:12:57 UTC
Permalink
Post by Olivier Miakinen
Mais même dans ce cas là tu devrais commencer par regarder le code HTML
généré (View/Page source) car il y a sûrement des choses à voir.
Il y aurait peut-être eu des indications dans un autre contexte, mais en
travaillant sur les en-têtes de document, il n'aurait pu avoir d'indices
qu'en examinant les en-têtes de la réponse... Dans le cas présent,
l'indice qu'il aurait du donner est l'adresse affichée par le navigateur
lorsque le serveur répond. Si c'est la même que la page d'origine, la
redirection n'a pas marché, pour x raisons.
Post by Olivier Miakinen
En quelques mots, le header("Location: ...") ne devrais jamais servir à
rien d'autre qu'à rediriger d'un site vers un autres, et pas entre deux
pages du même site.
Faux. Ou alors je vous suggère de soumettre vos sources. Rien de tel
n'est mentionné dans la RFC 2616. Et vous connaissez sûrement la
précision utilisée dans ces descriptions: MAY / MAY NOT - MUST / MUST NOT.
Pour tout le reste, il y a le libre arbitre.

Voir RFC2616 14.30 Location
Post by Olivier Miakinen
D'ailleurs il devrait toujours y avoir une URL
absolue (du genre http://www.example.com/test.html) et jamais une URL
relative (telle que test.html).
Vrai. Et je parierais même que c'est l'origine du problème.
Nota: Location est à utiliser avec l'une des réponses HTTP 3xx. (ou 201
Created, mais je ne pense pas que ce soit le cas pour notre
demandeur :o) )


Julien
Continuer la lecture sur narkive:
Loading...