2009-06-23 9 views
21

Auf einigen .NET-basierten Websites enden URLs nicht mit asp.net-Seitennamen wie default.aspx, sondern mit einem Muster http://sitename.com oder http://sitename.com/subdirectory/subdirectory. Die Site wird als Unterverzeichnisse von der Wurzel, d./tags,/users,/badges, die URLs wären/tags,/users,/badges.Wie werden URLs wie Stack Overflow bereinigt?

Stapelüberlauf verwendet, um ein bestimmtes Beispiel zu verwenden, Fragen-URLs des Formulars How do get clean URLs like Stackoverflow?. Das ist eine großartige Möglichkeit, die Seite für Suchmaschinen zu optimieren.

Wird dies mithilfe von HTTP-Handlern implementiert? Wird die GET-Anfrage basierend auf dem Pfad gefiltert und die gesamte Antwort wird basierend auf der Frage-ID im Handler selbst gebildet? Möchte noch jemand spekulieren?

+4

Diese Frage wurde bereits oft gefragt. –

+0

Ich glaube, Stack-Überlauf wird mit dem ASP.NET MVC-Framework gebaut, siehe www.asp.net/mvc – Charlie

+5

Lassen Sie die SO-Referenzen und das ist eine gute Frage. –

Antwort

21

Es ist ASP.Net MVC, die das .NET-Routing mehr oder weniger in gebaut hat. Das Routing als auch für nicht MVC-Projekte zur Verfügung steht, obwohl

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

Es ist nur eine DLL können Sie Drop in Ihrem bin-Ordner. Im Grunde verwendet es reguläre Ausdrücke, um Ihre URLs mit Seiten/Vorlagen zu vergleichen.

+1

Ab ASP.NET 4.0 ist eine bessere URL-Routing-Integration für Web Forms Ende 2009 angekündigt: [URL-Routing mit ASP.NET 4 Web Forms (VS 2010 und .NET 4.0 Series) - Blog von ScottGu] (http://weblogs.asp.net/scottgu/archive/2009/10/13/url-routing-with-asp-net-4-web-forms-vs-2010-and-net-4-0-series.aspx) – Lumi

18

Dies wird mit mod_rewrite in Apache oder ähnlichen Methoden von url_rewriting on IIS erreicht.

Hinweis: SOFlow verwendet Letzteres.

+2

Warum die Down-Abstimmung? – Sampson

+0

Wahrscheinlich, weil es gut dokumentiert ist, dass die Site Apache nicht verwendet. –

+7

Habe ich gesagt, dass es Apache verwendet? Nein. Der Fragesteller war daran interessiert, wie die URL funktioniert. Er gab nicht an, dass er daran interessiert war, wie sie aus einer .NET-Perspektive arbeiten. Ich habe eine Antwort für Apache und IIS angeboten. – Sampson

3

Ich weiß, dass Stack Overflow das ASP.NET MVC-Framework verwendet, das vermutlich ein URL-Rewriting-System eingebaut hat. Für Nicht-Windows-Systeme ist Apache mod_rewrite sehr verbreitet.

Zum Beispiel eine Wiki-Seite: http://server.com/wiki/Main_Page Anfrage wird vom Webserver behandelt. Es übersetzt in /wiki/index.php?page=Main_Page

Hier ist ein Beispiel von URL in Apache Umschreiben:

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] 

Was dies sagt, ist, wenn die URL, die in kommt forum-##.html ist dann Prozess, fordern, als ob es forumdisplay.php?fid=## waren. Das gleiche gilt für die thread-##.html Regeln.

5

Die URLs sind in diesem Format nach REST principles, in denen alles eine Ressource mit einer eindeutigen URL ist.

Ich denke, ich habe irgendwo im Blog gelesen, dass dies durch die Verwendung ASP.NET MVC framework erreicht wird.

0

Sie können es in ASP.net verwenden, indem Sie Context.RewritePath verwenden.

In Global.asax, erstellen Sie einen Application.BeginRequest Event-Handler.

Zum Beispiel, wenn Sie Anfragen von

example.com/questions 

tatsächlich geben die Ergebnisse von

example.com/Questions/Default.aspx 

Globale machen wollen.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> 

Wenn Ihre Web-Site ist, bevor .NET Framework alles läuft 4, werden Sie manuell auf dem runAllManagedModulesForAllRequests in web.config drehen müssen, da sonst die Beginrequest Ereignis wird nicht gefeuert werden :

<configuration> 
... 
    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true" /> 
    </system.webServer> 
</configuration> 
Verwandte Themen