Comment obtenir des URL propres telles que Stack Overflow?
-
10-07-2019 - |
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?
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>