web-dev-qa-db-fra.com

Rediriger 301 avec une partie de hachage (ancre) #

Un de nos sites Web a une URL comme celle-ci: example.oursite.com. Nous avons décidé de déplacer notre site avec une URL telle que celle-ci www.oursite.com/example. Pour ce faire, nous avons écrit une règle de réécriture sur notre serveur Apache qui redirige vers notre nouvelle URL avec le code 301.

De nombreux sites Web renvoient vers nous avec des URL de la forme example.oursite.com/#id=23. Le problème est que la redirection efface la partie de hachage de l'URL avec IE. Autant que je sache, la partie hachage n'est jamais envoyée au serveur.

Je voulais implémenter la redirection avec javascript pour conserver la partie hachage, mais le moteur de recherche ne saura pas que notre URL a changé. (pas de code 301 retourné)

Je souhaite que le moteur de recherche soit informé de notre nouvelle URL (301) car nous devons transférer le grade de page vers notre nouvelle URL.

Existe-t-il un moyen de rediriger avec un code 301 et de conserver la partie de hachage (#id=23) dans l'URL?

21
Mike

Les moteurs de recherche se soucient en fait des balises de hachage, ils les utilisent fréquemment pour mettre en valeur un contenu spécifique sur une page.

À la question, cependant, les emplacements d'ancrage ne sont malheureusement pas envoyés au serveur dans le cadre de la requête HTTP. Si vous souhaitez rediriger un utilisateur, vous devrez le faire en Javascript côté client.

Bon article: http://web.archive.org/web/20090508005814/http://www.mikeduncan.com/named-anchors-are-not-sent/

14
Eric Martindale

Google a une syntaxe spéciale pour les applications AJAX basée sur des URL de hachage: http://code.google.com/web/ajaxcrawling/docs/getting-started.html

2
kkaefer

Je suis à peu près certain que la partie hachage/page d'ancrage/signet d'une URL n'est pas indexée par les moteurs de recherche et n'a donc aucun effet sur le classement de votre page. Faire une recherche google pour "inurl: #" ne renvoie aucun document, ce qui sauvegarde mon hypothèse. Les liens provenant de sites externes seront indexés sans le hachage.

Vous avez raison de dire que la partie hachage n'est pas envoyée au serveur. Par conséquent, pour autant que je sache, il n'existe pas de moyen efficace de créer une URL de redirection contenant le hachage.

De ce fait, il appartient au navigateur de gérer correctement le hachage lors d’une redirection. Firefox 3.5 semble faire cela avec succès. Si vous ajoutez un hachage à une URL comportant une redirection connue, l'URL change dans la barre d'adresse, mais le hachage reste activé avec succès.

Edit : En réponse au commentaire ci-dessous, si n’est pas un signe dièse dans l’URL externe de la pièce dont vous avez besoin, il est tout à fait possible de réécrire l’URL. Une règle de réécriture Apache s'en chargerait:

RewriteCond %{HTTP_Host}   !^exemple\.oursite\.com [NC]
RewriteCond %{HTTP_Host}   !^$
RewriteRule ^/(.*)         http://www.oursite.com/exemple/$1 [L,R]

Si vous n'utilisez pas Apache, vous devrez alors rechercher quelque chose de similaire dans la documentation du serveur.

2
zombat

Étant donné que le serveur ne verra jamais le # (excluant les 301 redirections) et que Google a déconseillé d'utiliser leur système AJAX Crawling , il semble qu'une solution frontale soit le seul moyen!

Comment je l'ai fait:

 (function() {

    var redirects = [
        ['#!/about',         '/about'],
        ['#!/contact',       '/contact'],
        ['#!/page-x',        '/pageX']
    ]

    for (var i=0; i<redirects.length; i++) {
        if (window.location.hash == redirects[i][0]) {
           window.location.replace(redirects[i][1]);
        }
    }

 })();

Je suppose que, les robots d'exploration de Google exécutant bien le Javascript, les nouvelles pages seront correctement indexées.

Je l'ai placé dans une balise <script> directement sous la balise <title>, afin qu'il soit exécuté avant tout autre fichier JS/CSS. Notez que ce script ne devrait être requis que pour votre fichier d'index.

1
AlexKempton

Vous pouvez créer une page sur l'ancienne adresse qui capture toutes les demandes et redirige vers le nouveau site avec l'adresse et le code corrects.

J'ai fait quelque chose comme ça, mais c'était dans asp.net, qui n'est pas le langage que vous utilisez. Quoi qu'il en soit, il devrait y avoir un moyen de le faire dans n'importe quelle langue.

1
rslite

Lors du renvoi de l'état 301, votre serveur est supposé renvoyer un en-tête 'Location:' qui pointe vers le nouvel emplacement. En pratique, la manière dont cela est mis en œuvre varie; certains serveurs fournissent l'URL complète (netloc et chemin), certains fournissent simplement le nouveau chemin et attendent du navigateur qu'il recherche ce chemin sur le netloc d'origine. Il semble que votre règle de réécriture enlève le chemin.

Un moyen simple de voir l’en-tête Location renvoyé, dans le shell Python:

>>> import httplib
>>> conn = httplib.HTTPConnection('exemple.oursite.com')
>>> conn.request('HEAD', '/')
>>> res = conn.getresponse()
>>> print res.getheader('location')

J'ai bien peur de ne pas savoir assez sur mod_rewrite pour vous expliquer comment appliquer correctement la règle de réécriture, mais cela devrait vous donner une idée de ce que votre serveur demande réellement aux clients.

1

J'ai enregistré mon compte afin que je ne puisse pas éditer.

zombat: Je suis désolé d'avoir commis une erreur dans mon commentaire. Le lien vers notre vidéo est exemple.oursite.com/#video_id=233. Dans ce cas, ma règle de réécriture dans Apache ne fonctionne pas.

Nick Berardi: Nous avons changé la façon dont nos liens fonctionnent. Nous n'utilisons plus #, seulement pour la compatibilité ascendante

0
Mike

Les robots de recherche ne s'intéressent pas aux balises de hachage. Et si vous les utilisez pour un certain type d'appels flash ou AJAX, vos problèmes seront plus graves que vos redirections 301 ne fonctionnent pas. Parce que, sauf si vous avez le contenu sous une autre forme, les moteurs de recherche n'indexent pas votre site et vous souffrez définitivement en ce qui concerne le référencement.

0
Nick Berardi