Double astuce pour les liens & autres(à partir de l'url)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 672 fois - Téléchargée 28 fois

Contenu du snippet

C'est un petit peu compliqué à comprendre l'utilité, puis le code lui-même. (Les explications de l'utilisation de ces astuces sont dans la conclusion)

-----------------------------------------------------------------------------------------------
1ERE PROBLEMATIQUE :
Sur votre site, pour ne pas répéter la structure (bannière, menu,pied-de page, tout ce qui ne change pas d'une page à l'autre), vous utilisez l'url:
Exemple:http://www.votresite.ext/la_page_qui_contient_tout.php?la_page_a_inclure=celle_la.php
dans 'la_page_qui_contient_tout.php', vous avez un code du style: include($_GET['la_page_a_inclure']);'
Malheureusement, ce système a l'inconvénient de ne pas plaire à certains référenceurs de sites qui n'aiment pas les '?' dans l'url, et qui, par conséquent, refuseront de référencer votre chef-d'oeuvre, objet de votre fierté qui DOIT être connu.
Il faut utiliser dans ce cas des url du type:
http://www.votresite.ext/la_page_qui_contient_tout.php/celle_la.php
et dans votre code, vous mettez : include(substr($_SERVER["PATH_INFO"],1)); (j'ai trouvé ça dans Login n°109, article de Yann Rocq)
Malheureusement encore, imaginons que la page à inclure soit dans un sous répertoire (du type : mon_répertoire/celle_ci.php), à ce moment, la page ne sera pas trouvée, car le répertoire sera ignoré.

-----------------------------------------------------------------------------------------------
2NDE PROBLEMATiQUE:
Elle est liée à la première.
exemple:l'utilisateur peut être sur la page : P1: http://www.votresite.ext/la_page_qui_contient_tout.php/celle_la.php
il peut aussi être sur la page : P2: http://www.votresite.ext/la_page_qui_contient_tout.php/mon_répertoir/celle_ci.php
Du fait que les fichiers inclus peuvent être avec ou sans répertoire avant le nom du fichier (exemple: 'celle_la.php' et 'mon_répertoire/celle_ci.php'), les liens ne peuvent pas être directs (exemple: <a href='../ma_page.php'>ma_page</a>) car si la page actuelle est P1, si l'utilisateur suit le lien, il arrivera sur l'url:
http://www.votresite.ext/ma_page.php
tandisque s'il est sur la page P2 et qu'il suit le même lien, il arrivera sur:
http://www.votresite.ext/la_page_qui_contient_tout.php/ma_page.php
La seule solution est de mettre l'url complète à chaque lien. Cela donnera pour le lien précédent: <a href='http://www.votresite.ext/la_page_qui_contient_tout.php/ma_page.php'>ma_page</a>
que l'utilisateur soit sur P1 ou P2, il arrivera au même endroit.
Mais il reste un problème. Vous dévelloppez en local, et l'url complète chez vous est différente de l'url complète en ligne.
Chez vous, le lien sera ( avec EasyPHP):
<a href='http://127.0.0.1/www/votre_site/la_page_qui_contient_tout.php/ma_page.php'>ma_page</a>
En ligne, le lien sera:
<a href='http://www.votresite.ext/la_page_qui_contient_tout.php/ma_page.php'>ma_page</a>
Il faut donc que les liens dépendent du lieu de sur quel site l'utilisateur ou vous vous connectez.
Les problèmes est le même pour appeller un page css, ou tout autre fichier.

Source / Exemple :


//-----------------------------------------------------------
/* 1ERE PROBLEMATIQUE  */
/* version 'pas à pas' */
//exemples: 
//P1 l'url en ligne : 'http://www.votresite.ext/la_page_qui_contient_tout.php/celle_la.php'
//P2 l'url en local: 'http://127.0.0.1/www/votre_site/la_page_qui_contient_tout.php/celle_la.php'

$len=strlen($_SERVER['SCRIPT_NAME'] + 1 );
//renverra
//P1 44
//P2 59

$inc=substr($_SERVER['REQUEST_URI'],$len);
//renverra
//P1 & P2 "celle_la.php"

/* Version 'compacte' */
$inc = substr($_SERVER['REQUEST_URI'],strlen($_SERVER['SCRIPT_NAME']) + 1);

//--------------------------------------------------------
/* 2NDE PROBLEMATIQUE*/

/* version compacte */
$x = strtok($_SERVER['PATH_INFO'],'/');
$y ="../";
while($x=strtok('/')){
	$y .= "../";
}
define( 'HERE' , $y );

Conclusion :


J'espère que vous avez compris.
Pour la suite:
Pour les liens, il suffit de mettre:
<a href=<?= "\"".HERE ?>(la_page_qui_contient_tout.php/)ma_page.php">ma page</a>
Ce qu'il y a entre () n'est pas indispensable si le lien ne dirige pas vers lea page de structure avec une inclusion.

Pour l'inclusion :
include($inc);

Bravo à ceux qui ont suivi jusque là et qui ont compris ;-) (moi-même, je suis pas sûr :p ).

Prévenez-moi si cela ne marche pas.

L'avantage de ce système est qu'il ne dépend pas du tout de l'adresse du site, ni du répertoire où il se trouve.

EDIT du 28/05/2004:
La dernière version de la 2ème astuce est mieux, car elle n'utilise plus une URL absolue du type http://www.lesite.ext, mais une URL relative du typpe ../../le_rep/lefichier.ext
/EDIT

A voir également

Ajouter un commentaire

Commentaires

Samiby
Messages postés
118
Date d'inscription
mercredi 26 novembre 2003
Statut
Membre
Dernière intervention
2 janvier 2006
-
Merci Natim.
J'aimerais préciser, à l'attention de tout le monde, que ça peut s'employer avec un switch.
Le code de Kilco peut devenir :
-------------------------------------------------------
define('HERE',strrev(substr(strrev("http://".$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']),strlen(strtok(strrev($_SERVER['SCRIPT_NAME']),"/"))+1)));
$p = substr("http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'],strlen(HERE."/general.php."));
switch ($p){
case ("codessources"):
$inclus = "pageainclure.php";
break;
}
include ($inclus);
-------------------------------------------------------
cs_Natim
Messages postés
24
Date d'inscription
lundi 12 mai 2003
Statut
Membre
Dernière intervention
26 juin 2004
-
Moi je trouve que c un bon truc !!
La preuve c qu'il est utilisé sur php.net
Enfin !! c pas une preuve
Moi je trouve que c très pratique car on peut accerder directement à la fonction que l'on cherche.
Il n'y a qu'a faire http://www.php.net/echo ou http://www.php.net/break pour connaitre leurs utilités

Enfin !! on est tjs mal compris dans ce monde
Bravo
Samiby
Messages postés
118
Date d'inscription
mercredi 26 novembre 2003
Statut
Membre
Dernière intervention
2 janvier 2006
-
Je viens de tester, l'astuce de mettre les fichiers à inclure dans un dossier spécial sécurise l'inclusion. Si l'utilisateur met une url du type 'http://www.phpcs.com/auteurdetail.aspx?ID=198832', la page '404...' sera chargée (même si il enlève 'http://'), et s'il met une adresse du type '../telle_page.ext', 'telle_page.ext' sera chargée à l'adresse : 'http://www.votresite.ext/telle_page.php', de même si il ne met pas '.php', sans passer par le fichier d'inclusion ('la_page_qui_contient_tout.php'), comme s'il mettait directement 'http://www.votresite.ext/telle_page.php';
Ce système est donc assez sécurisé.

Dites-moi si vous voyez une autre faille, c'est toujours utile.

PS:tests faits sur http://www.ichthus-ados.com , qui utilise ce système.
Samiby
Messages postés
118
Date d'inscription
mercredi 26 novembre 2003
Statut
Membre
Dernière intervention
2 janvier 2006
-
Si tuveux, mais je ne suis pas convaincu.
Après tout, ça à l'air compliqué comme ça, mais concrètement, c'est presque rien.

Pour la 2nde problèmatique, il faut mettre 'define('HERE',strrev(substr(strrev("http://".$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']),strlen(strtok(strrev($_SERVER['SCRIPT_NAME']),"/"))+1)));', et sur tous les lien, il faut mettre "<?= HERE ?>" au début de l'url.

Et pour la 1ere, il faut mettre juste 'inckude(substr("http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_UlI'],strlen(HERE."/general.php.")));' pour avoir la page insérée.
C'est vrai qu'au niveau sécurité, c'est pas le top, mais rien ne t'empèche de mettre tous les fichiers qui doivent être inclus dans un dossier spécial, et de l'inclure par 'include("le_dossier_qui_contient_les_pages_a_inclure/".substr("http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'],strlen(HERE."/general.php.")).".php");' (le ".php" c'est si tu veux que l'extension n'apparraisse pas. Dans ce cas, si l'utilisateur met n'importe quoi, tu peux toujours vérifier que le fichier existe dans le répertoir, et si ce n'est pas le cas, tu inclus une page du style '404, page non trouvée...'.
Kilco
Messages postés
30
Date d'inscription
mardi 28 octobre 2003
Statut
Membre
Dernière intervention
22 septembre 2004
-
fyav rendort toi!!
c du php de base que tu nous parle là!!
le genre de codage qui sert à rien et pis les visiteurs se retrouverait sur des pages sans sommaire et des trucs comme ca!!!

Anthomicro ca crée aucune faille de sécu!! ca fait pas très joli c'est tout!!!

samiby alor tas cas utiliser des fonctions pour toutes tes pages qui te donne le graphisme du site et avec tes informations tu fait des pages différentes

ex:
function entête(){
//graphisme entête
}
function pagenorm(){
//graphisme page norm
}
function pagenormfin(){
//graphisme page normfin
}
...


page1.php
------------
entête()
pagenorm()
informations
pagenormfin()

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.