2010-09-21 5 views
3

Toutes les pages de mon application Web ont donc des URI de la forme http://www.example.com/#some-hash et similaires. Mais bien sûr, si l'utilisateur visite http://www.example.com/some-hash, ils devraient être redirigés et l'expérience du site dans sa gloire habituelle.La meilleure façon de rediriger vers une version hachée d'un URI?

OK, pas de problème, non? Il suffit d'écrire une sorte d'intercepteur de requête HTTP globale qui redirige automatiquement n'importe quoi vers sa version hachée.

Mais cela ne fonctionne pas tout à fait, parce que l'idée de visiter http://www.example.com/#some-hash est que la page « frame » (à savoir http://www.example.com/) puis Ajax-charges http://www.example.com/some-hash dans son cadre intérieur. Ainsi, la solution simple mentionnée ci-dessus s'exécute en boucles infinies lorsque cet Ajax se produit, car les requêtes Ajax devraient au moins être autorisées à obtenir la version non hachée.

En ce moment, j'ai une solution insatisfaisante où tous mes « sous-pages » comprennent

if (window.location.pathname != "/") 
{ 
    window.location.href = window.location.protocol + "//" + window.location.host + "/#" + window.location.pathname.substring(1); 
} 

Le plus gros problème, en plus de la duplication de code (qui est quelque peu atténué en utilisant un cadre combinant script), est que Lorsque l'utilisateur visite http://www.example.com/some-hash, la version non stylée et non formatée de la page prend une seconde ou deux à charger, et seulement puis fait le feu de redirection JavaScript. Pas drôle! Donc, je suis à la recherche de meilleures solutions. Du côté serveur, nous travaillons sur ASP.NET MVC 2, mais c'est un peu agnostique. Peut-être quelque chose comme, ajouter "? Framed = true" aux demandes lors de l'utilisation Ajax, puis faire une redirection côté serveur chaque fois que les chemins non-racine sont dirigés qui n'ont pas framed = true dans leur chaîne de requête? Je suis intéressé par la façon dont vous résoudre ce problème.

Répondre

2

Vous pouvez envisager une solution de réécriture d'URL côté serveur à la place. Que cela soit approprié dépendra de plus de connaissances sur votre site et votre infrastructure, mais en général, les modules tels que mod_rewrite (ou l'équivalent sur votre serveur de choix) pourraient très bien gérer la variation "somehash" vs "#somehash" que vous avez décrit.

http://httpd.apache.org/docs/current/mod/mod_rewrite.html (manuel) http://httpd.apache.org/docs/2.0/misc/rewriteguide.html (exemples)

+0

Est-ce que cette adresse la question dans mon troisième paragraphe? Parce que pour autant que je sache, c'est l'une des solutions naïves que j'ai décrites dans mon deuxième paragraphe et j'ai immédiatement expliqué pourquoi cela ne fonctionnait pas. – Domenic

+0

Je pense que ce sera le cas. Je le résoudrai fondamentalement d'une manière similaire à ce que vous avez décrit dans votre dernier paragraphe. (Désolé, lors de ma première lecture, j'ai manqué la remarque côté serveur dans celui-ci.) Demandez à votre application de générer des URL Ajax que le serveur peut rediriger de manière appropriée. Peut-être une question plus fondamentale est de savoir si vous avez réellement besoin de cette relation somehash/# somehash du tout? Êtes-vous coincé avec certaines URL qui doivent rester comme cela nécessite l'équivalence? Si ce n'est pas le cas, je restructurerais les choses pour que les URL des cadres internes ne soient jamais vues par l'utilisateur. – LVB

Questions connexes