2010-06-20 10 views
0

d'abord, je fais cela pour un robot Web (aka araignée aka ver ...)normalisant partie uri donnée url de base, avec PHP

Étant donné deux chaînes (url de base et url relative), j'ai besoin pour déterminer l'URL absolue. Il est particulièrement déroutant quand il s'agit de « SEO friendly » merde, tels que:

url de base: http://aaa.com/january/15/test url Trouvé: /test.php?aaa

Comment puis-je savoir que ci-dessus ne sont pas dossiers ou non? Par exemple; le chemin absolu serait:

http://aaa.com/january/15/test/test.php?aaa

Ou:

http://aaa.com/january/15/test.php?aaa

?

La confusion provient de l'existence ou non d'un index en action. "/test/index.php" ou "/index.php"?

+1

Je pense qu'un * ver * est quelque chose de différent;) –

+0

http://en.wikipedia.org/wiki/Web_crawler#cite_ref-36 Peut-être un nom de vieille école? – Christian

+0

Eh bien, cela semble se rapporter à une application réelle qui a été nommée de cette façon. Le terme * ver * fait normalement référence à un certain type de logiciel malveillant. Mais je ne veux pas discuter, je viens de le remarquer;) –

Répondre

1

Vous ne pouvez pas résoudre ce problème en examinant uniquement l'URL.

Vous dites que vous avez besoin de l'URL absolue avec une URL de base et une URL relative. L'URL complète est la concaténation de l'URL de base et de l'URL relative. Comme vous l'avez vu, sachant cela n'aide pas un peu.

http://example.com/directory/index.php et http://example.com/directory/ peut légitimement se référer à deux ressources différentes.

http://example.com/directory/index.php et http://example.com/directory/foo/bar/baz.php peuvent légitimement se référer à la même ressource ultime.

Dans le deuxième exemple ci-dessus, quelle est l'URL canonique? Ce n'est pas quelque chose qui peut être nécessairement déterminé par calcul. L'URL canonique est celle que vous choisissez comme URL canonique.

Vous êtes confronté en fait deux problèmes:

  1. Quand les deux URL différentes se réfèrent à la même ressource?
  2. Quelle URL est l'URL canonique?

1. Quand deux URL différentes font-elles référence à la même ressource?

Cela ne peut pas être déterminé en comparant les URL de quelque façon que ce soit. Cela peut uniquement être déterminé en comparant la ressource elle-même, c'est-à-dire le contenu et les en-têtes HTTP.

ETag-http://en.wikipedia.org/wiki/HTTP_ETag

En bref, le ETag est un en-tête HTTP qui est unique pour une ressource. Son but est de valider le cache, c'est-à-direLe contenu que j'ai dans mon cache est-il le même que le contenu au http://example.com/content? Deux ressources identiques, au moins provenant du même hôte, auront la même valeur d'en-tête ETag. Utilisez ceci si possible (tous les serveurs web ne renverront pas un en-tête ETag).

en-tête HTTP et la comparaison du contenu

Lorsque deux ressources identiques? Lorsque le type de contenu et le contenu sont les mêmes

Comparez le type de contenu à l'aide de l'en-tête Content-Type. Comparer le contenu lui-même est un cas simple de comparaison de chaînes.

Si vous stockez des propriétés de ressources précédemment trouvées et que vous les comparez à des ressources nouvellement trouvées, vous n'avez pas besoin de prendre en compte le texte complet de la ressource à des fins de comparaison.

En ce qui concerne PHP, le HTTP extension vous donnera tout ce dont vous avez besoin avec une API OO très pratique pour examiner les en-têtes HTTP et le contenu complet d'une ressource. La fonction md5() est une option pour générer un hachage unique. Il y en a d'autres.

2. Quelle URL est l'URL canonique?

Choisissez-en un et respectez-le. Par défaut, une URL n'est pas plus canonique qu'une autre pour la même ressource. Pour plus de simplicité, vous pouvez considérer la plus courte des deux URL comme étant la forme canonique.

+0

Post très utile, cependant, comment puis-je concaténer 2 parties correctement sans générer beaucoup de 404 d'abord? – Christian

+0

@ Christian: Je vois, je n'ai pas tout à fait obtenir votre question. URL de base: http://aaa.com/january/15/test URL trouvée: /test.php?aaa => URL absolue: http://aaa.com/test.php?aaa –