Precisions sur sessions

WRInaute impliqué
Salut les gars (et filles en moins grand nombre) :wink:

j'ai fait des recherches sur le forum concernant mes problèmes de sessions pour référencement et il me reste quelques questions que j'aimerais que vous régliez. :lol:

je ne peux pas toucher au php.ini, je me sers des cookies mais dois me servir aussi des transmissions par url, alors voilà les solutions que j'ai trouvé sur wri mais j'ai des questions concernant ces solutions :

1) repérer l'ip des robots et en fonction ouvrir ou pas une session.
prob : il me semble que ce doit être dur à gérer pour les mises à jour

2) WebRankInfo a marqué dans un post qu'on devait alors "utiliser des url absolues (http)"
si je comprends bien, cela veut dire que sur les liens des pages on doit mettre h**p://monsite.com/page2.php?$SID au lieu de page2.php?$SID
cela suffit il à débloquer google ?
et si oui, merci de m'expliquer.

3) absoluteweb a lui marqué qu'il suffisait de changer le nom de session SID ou PHPSESSID par un nom propre au site par exemple "votre-variable-de-session".
cela suffit il à débloquer google ? ca me parait bizarre.
et si oui, merci de m'expliquer. (j'aime bien comprendre :D )

voilà je pense que ce sont les seules solutions que j'ai trouvé sans toucher au php.ini et aussi en gardant les sessions par url.
Merci de me dire ce que vous en pensez des solutions ou si vous avez autre chose je suis preneuse.

merci de votre aide
carole :wink:
 
Olivier Duffez (admin)
Membre du personnel
Salut la fille ;-)

j'ai trouvé un exemple de site qui a dû utiliser il me semble un mélange des solutions 1 et 3 : h**p://v2.webdistrib.com/cat/home.php
il génère un identifiant de session qu'il mélange dans le reste de l'URL, comme par exemple : h**p://v2.webdistrib.com/(15c0a3acfe4c592e)/cat/home.php

par contre en regardant les 3000 pages que Google a indexées, j'imagine qu'ils détectent Google pour ne pas lui attribuer d'identifiant de session.

pour la solution 2 tu as bien compris mais il me semble que ça ne marche pas dans tous les cas (d'autres voudront bien confirmer...)

Olivier
 
WRInaute passionné
Pour le point 1
Ne pas utiliser les IP, mais le $_SERVER["HTTP_USER_AGENT"]
et les valeurs possbiles en exemple
Code:
("Googlebot","Slurp","Fast","ia_archiver","Scooter","VoilaBot","xecho")
A completer avec d'autres noms d'agent de robot
 
WRInaute impliqué
Moi j'utilise des URL absolues
Avec création de sessions si ce n'est pas un robot.
Du coup pas de "id" dans l'url et pas de sessions génantes pour les robots.
 
WRInaute passionné
Kmacleod a dit:
Pour le point 1
Ne pas utiliser les IP, mais le $_SERVER["HTTP_USER_AGENT"]
et les valeurs possbiles en exemple
Code:
("Googlebot","Slurp","Fast","ia_archiver","Scooter","VoilaBot","xecho")
A completer avec d'autres noms d'agent de robot

En plus, avec cette méthode, tu as l'avantage de pouvoir tester facilement le résultat, en utilisant un navigateur qui te permet de modifier son user-agent.
 
WRInaute impliqué
Tout d'abord merci beaucoup les gars car vous trouvez toujours les solutions :wink:

ensuite Kmacleod a écrit :
Kmacleod a dit:
Pour le point 1
Ne pas utiliser les IP, mais le $_SERVER["HTTP_USER_AGENT"]
et les valeurs possbiles en exemple
Code:
("Googlebot","Slurp","Fast","ia_archiver","Scooter","VoilaBot","xecho")
A completer avec d'autres noms d'agent de robot

1) ca c'est super comme truc car y a donc pas besoin de mise à jour, est ce que mon code est correct ? :
Code:
if ($_SERVER["HTTP_USER_AGENT"] != googlebot)
{
session_start();
}

2) comment trouver tous les noms des robots ?

3) BadProcESs a écrit
"En plus, avec cette méthode, tu as l'avantage de pouvoir tester facilement le résultat, en utilisant un navigateur qui te permet de modifier son user-agent."
comment fait cela ?

et encore mille merci car y a plus de tueurs ici que dans les forums spécialisés en php :lol:
carole
 
WRInaute passionné
caro a dit:
1) ca c'est super comme truc car y a donc pas besoin de mise à jour, est ce que mon code est correct ? :
if ($_SERVER["HTTP_USER_AGENT"] != googlebot)
{
session_start();
}

Non, c'est pas bon, car le nom d'agent ne sera pas juste 'googlebot' (d'ailleurs même dans ce cas il faudrait des guillemets autour). Tu dois donc chercher la présence de "googlebot" dans l'user agent, et ça peut se faire avec stristr()

Du genre :

Code:
if (stristr($_SERVER['HTTP_USER_AGENT'], 'googlebot') === FALSE) {
     //_____ c'est pas googlebot !
}
else {
     //_____ c'est googlebot !
}

caro a dit:
2) comment trouver tous les noms des robots ?

Télécharge Robostats et regarde la liste des robots présents, ça t'en fera déjà pas mal.

caro a dit:
3) BadProcESs a écrit
"En plus, avec cette méthode, tu as l'avantage de pouvoir tester facilement le résultat, en utilisant un navigateur qui te permet de modifier son user-agent."
comment fait cela ?

Par exemple avec WannaBrowser.

Fred
 
WRInaute impliqué
ai je bien compris George ?

Code:
if (stristr($_SERVER['HTTP_USER_AGENT'], 'googlebot') === FALSE)
&& (stristr($_SERVER['HTTP_USER_AGENT'], 'fast') === FALSE)
{ 
//c'est pas un robot
session_start()
// et tout le tralala 
} 
else
{ 
// c'est un robot
//on peut mettre un mailto afin d'alerter le webmaster d'un crawl sur la page 
}

j'espère que j'ai compris, en lisant l'article du stristr (qui est quand même peu développé) je pense avoir compris qu'il s'agissait d'une fonction permettant de rechercher une chaine dans une chaine de caractère et que si elle ne trouvait pas elle ranvoyait "false".

George, est ce sûr à 100% ?

et encore merci pour toute votre aide. :wink: carole
 
WRInaute passionné
C'est pas George, mais Fred
le mailto est surement pour faire appel de la fonction php mail

Avec celà tu limites à deux moteurs

Mais quel est le but de cet algo, recevoir beaucoup de mail par jour ?
sinon il y a robostats qui piste le passage des robots
 
WRInaute impliqué
non c'est parce qu'en reprenant l'exemple qu'avait donné george au dessus il y avait un "else" et au lieu de le supprimer je sais pas pourquoi j'ai marqué "mailto" en exemple, un peu pourri mon exemple d'ailleurs :lol:
le mieux c'est juste d'enlever le "else" car cette source est juste présente pour supprimer les sessions aux robots.

apres je rajouterais les autres moteurs, c'était juste pour vérifier le code.
 
WRInaute passionné
caro a dit:
if (stristr($_SERVER['HTTP_USER_AGENT'], 'googlebot') === FALSE)
&& (stristr($_SERVER['HTTP_USER_AGENT'], 'fast') === FALSE)
{
//c'est pas un robot
session_start()
// et tout le tralala
}
else
{
// c'est un robot
//on peut mettre un mailto afin d'alerter le webmaster d'un crawl sur la page
}

Ton if est mal construit :

Code:
if ( (stristr($_SERVER['HTTP_USER_AGENT'], 'googlebot') === FALSE)
&& (stristr($_SERVER['HTTP_USER_AGENT'], 'fast') === FALSE) ) {


caro a dit:
j'espère que j'ai compris, en lisant l'article du stristr (qui est quand même peu développé) je pense avoir compris qu'il s'agissait d'une fonction permettant de rechercher une chaine dans une chaine de caractère et que si elle ne trouvait pas elle ranvoyait "false".

George, est ce sûr à 100% ?

C'est plus qu'un article, c'est la doc officielle PHP ;) Et tu as parfaitement compris ce que faisait cette fonction. Il y a aussi stripos(), j'ignore laquelle des deux est la plus rapide, il faudrait faire des tests.

Sinon, oui, c'est sûr, enfin, autant sûr que peut l'être une détection par user agent (sachant qu'on peut le modifier et se faire passer pour google).

Fred
 
WRInaute impliqué
merci beaucoup George pour ton aide
(désolé pour mon oubli de paranthèse dans ma fonction "if" , décidemment je fais tout trop vite en ce moment)
 
WRInaute impliqué
Michèle, tu peux aussi écrire :

Code:
if (!eregi("googlebot|fast|robot",$navigateur))

Et tu peux en mettre 40 à la file comme cela...
Bonjour à Georges...
 
WRInaute passionné
Remi L. a dit:
Code:
if (!eregi("googlebot|fast|robot",$navigateur))

Les "bêtes" fonctions de chaînes de caractères sont moins complexes et plus rapides que les expressions régulières. Mais si on veut vraiment utiliser les regex, alors il faut préférer les fonctions PCRE aux fonctions POSIX (ces dernières sont plus lentes). Donc preg_match() serait mieux.

Code:
if (!preg_match('/googlebot|fast|etc./i', $_SERVER['HTTP_USER_AGENT'])) {
// etc.
}

Fred
 
A
Anonymous
Guest
Je dirais même mieux
Code:
if (!ereg("googlebot|fast|robot",$navigateur))

comme ça t'as pas de problème de casse de caractère :)

oulah, j'avais pas vu le preg_match qui arrivait aprés :oops:
 
WRInaute impliqué
Il faut peut-être mieux faire le test en 'case insensitive', par ce que quand on regarde la liste des IDs de robots, on voit de tout...
 
WRInaute discret
Code:
$robotList = array('googlbot', 'inktomi');

//-- Si vous avez rentré le nom exact du robot dans le tableau: (solution la meilleure dans le cas que j'évoque, voir ma conclusion)

if (in_array($_SERVER['HTTP_USER_AGENT'], $robotList))
{
   // c'est un robot
}
else
{
}


//-- Dans le cas ou on a pas rentré le nom exact (genre "googlebot" etc.)
$cpt = 0;
foreach($robotList as $robotName)
{
    if (eregi($robotName, $_SERVER['HTTP_USER_AGENT']))
        $cpt++;
}

if ($cpt)
{
   c'est un robot
}
else
{
   visiteur normal
}

Avantage: qui dit données dans une variable tableau dit donnée dans une base de données... Permet d'utiliser par exemple la table robots de RobotsStats etc...

A+!
 
WRInaute passionné
sepang : ok, mais pourquoi eregi, qui est plus lent ?

Il faudrait faire des tests, mais à la limite, ce serait, je pense, encore plus rapide, en gardant le tableau comme ci-dessus, d'utiliser la boucle juste pour construire le pattern (/google|fast|etc./i) et n'exécuter qu'une seule fois la fonction de regex ensuite.

Fred
 
WRInaute discret
in_array() est vraiment ultra rapide...

Et eregi pour la casse, mais bon, apres tu ajuste, si tu penses vraiment que tes données ont été bien rentrées, tu vires le "i"

Sinon oui ta solution est bien aussi... On pourrait chipoter à coups de benchmark, mais bon, je suis sur que 80% des personnes qui s'intéressent à ce post utilisent PHPBB, donc on va peut etre pas parler d'optimisation hein :D
 
WRInaute passionné
sepang a dit:
in_array() est vraiment ultra rapide...

C'est vrai, mais je parlais surtout pour la deuxième option (sans les noms exacts).

sepang a dit:
Et eregi pour la casse, mais bon, apres tu ajuste, si tu penses vraiment que tes données ont été bien rentrées, tu vires le "i"

Je voulais dire "pourquoi eregi() au lieu de preg_match()", je me suis mal exprimé.

Fred
 
Nouveau WRInaute
sepang a dit:
Avantage: qui dit données dans une variable tableau dit donnée dans une base de données... Permet d'utiliser par exemple la table robots de RobotsStats etc...


Dans le cas de l'utilisation de RobotsStats, on a l'include de robotstats.inc.php

inutile donc de faire 2 fois le travail:
la variable $detecte est sur false par défaut, et sur true lorsqu'un bot a été detecté.

Code:
if(!$detecte){
	session_start();
	}

le code suivant devrais suffir dans ce cas là? Et ne serais-ce pas le plus rapide d'entre tous (sans recoder RobotsStats bien sûr)?


Seagull
 
Discussions similaires
Haut