Question

Sur certains sites .NET, les URL ne se terminent pas par les noms de page asp.net, comme default.aspx, mais utilisent un modèle http://sitename.com ou http://sitename.com/subdirectory/subdirectory. Le site est mappé en tant que sous-répertoires de la racine, c'est-à-dire. / tags, / users, / badges, les URL seraient respectivement / tags, / users, / badges.

Stack Overflow, pour utiliser un exemple spécifique, utilise des URL de question de la forme Comment obtenir des URL propres comme Stackoverflow? . C'est un excellent moyen d'optimiser la page pour les moteurs de recherche.

Ceci est-il implémenté à l'aide de gestionnaires HTTP? La demande GET est-elle filtrée en fonction du chemin d'accès et toute la réponse est formée dans le gestionnaire lui-même en fonction de l'identifiant de la question? Quelqu'un d'autre veut spéculer?

Était-ce utile?

La solution

C'est ASP.Net MVC, qui intègre plus ou moins le routage .Net. Le routage est également disponible pour les projets autres que MVC, mais

http://msdn.microsoft.com/en-us/library/ cc668201.aspx

C'est juste un fichier .dll que vous pouvez déposer dans votre dossier bin. Fondamentalement, il utilise des expressions régulières pour faire correspondre vos URL à des pages / modèles.

Autres conseils

Ceci est réalisé avec mod_rewrite dans Apache, ou une méthode similaire url_rewriting sur IIS .

Remarque: SOFlow utilise ce dernier.

Les URL sont dans ce format, conformément aux principes REST , dans lesquels tout est une ressource avec URL unique.

Je pense avoir lu quelque part sur le blog que cet objectif était atteint à l'aide du framework ASP.NET MVC .

Je sais que Stack Overflow utilise le framework ASP.NET MVC, qui possède probablement un système de réécriture d'URL intégré. Apache mod_rewrite est très courant pour les systèmes autres que Windows.

Par exemple, une demande de page wiki: http://server.com/wiki/Main_Page est gérée par le serveur Web. Il est traduit en /wiki/index.php?page=Main_Page

Voici un exemple de réécriture d'URL dans Apache:

RewriteEngine on
RewriteRule ^forum-([0-9]+)\.html$ forumdisplay.php?fid=$1 [L,QSA]
RewriteRule ^forum-([0-9]+)-page-([0-9]+)\.html$ forumdisplay.php?fid=$1&page=$2 [L,QSA]

RewriteRule ^thread-([0-9]+)\.html$ showthread.php?tid=$1 [L,QSA]
RewriteRule ^thread-([0-9]+)-page-([0-9]+)\.html$ showthread.php?tid=$1&page=$2 [L,QSA]

Cela dit si l'URL fournie est forum - ##. html , puis traiter cette demande comme s'il s'agissait de forumdisplay.php? fid = ## . Il en va de même pour les règles - ##. Html .

Vous pouvez le faire dans ASP.net en utilisant Context.RewritePath .

Dans Global.asax , créez un Gestionnaire d'événements Application.BeginRequest .

Par exemple, si vous souhaitez effectuer des requêtes sur

example.com/questions

renvoie les résultats de

example.com/Questions/Default.aspx

Global.asax :

<%@ Application Language="C#" %>
<script runat="server">

   void Application_BeginRequest(Object sender, EventArgs e)
   {
       string originalPath = HttpContext.Current.Request.Path.ToLower();

       if (originalPath.Contains("/questions"))
       {
           String newPath = originalPath.Replace("/questions", "/Questions/Questions.aspx");
           Context.RewritePath(newPath);
       }
    }
</script>

Si votre site Web exécute une version antérieure à .NET Framework 4, vous devez activer manuellement le runAllManagedModulesForAllRequests dans web.config , sinon le BeginRequest : l'événement ne sera pas déclenché:

<configuration>
...
   <system.webServer>
      <modules runAllManagedModulesForAllRequests="true" />
   </system.webServer>
</configuration>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top