2009-06-23 7 views
21

Su alcuni siti gestiti da .NET, gli URL non terminano con i nomi delle pagine asp.net, come default.aspx, ma utilizzano un modello http://sitename.com o http://sitename.com/subdirectory/subdirectory. Il sito è mappato come sottodirectory dalla radice, es./tag,/utenti,/badge, gli URL sarebbero/tag,/utenti,/badge rispettivamente.Come ottenere URL puliti come Stack Overflow?

Stack Overflow, per utilizzare un esempio specifico, utilizza gli URL delle domande del modulo How do get clean URLs like Stackoverflow?. Quale è un ottimo modo per ottimizzare la pagina per i motori di ricerca.

È implementato utilizzando gestori HTTP? La richiesta GET viene filtrata in base al percorso e l'intera risposta è formata nel gestore stesso in base all'id domanda? Qualcun altro si preoccupa di speculare?

+4

Questa domanda è stata posta tante volte in precedenza. –

+0

L'overflow di beleive stack è stato creato utilizzando il framework ASP.NET MVC, vedere www.asp.net/mvc – Charlie

+5

Rilasciare i riferimenti SO e questa è una grande domanda. –

risposta

21

E 'ASP.Net MVC, che ha il Net Routing maggiore o minore costruito. Il routing è disponibile per i progetti non MVC, nonché, se

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

E' solo una dll è possibile rilasciare la cartella bin. Fondamentalmente usa espressioni regolari per abbinare i tuoi URL alle pagine/modelli.

+1

A partire da ASP.NET 4.0, è disponibile una migliore integrazione di Routing URL per Web Form, annunciata alla fine del 2009: [Routing URL con moduli Web ASP.NET 4 (VS 2010 e .NET 4.0 Series) - Blog di 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

Questo risultato è ottenuto con mod_rewrite in Apache o metodi simili di url_rewriting on IIS.

Nota: SOFlow utilizza quest'ultimo.

+2

Perché il down-vote? – Sampson

+0

Probabilmente perché è ben documentato che il sito non usa Apache. –

+7

Ho detto che usa Apache? No. Il richiedente era interessato a come funziona l'URL. Non ha specificato di essere interessato a come funzionano da una prospettiva .NET. Ho offerto una risposta sia per Apache che per IIS. – Sampson

3

So che Stack Overflow utilizza il framework ASP.NET MVC, che presumibilmente ha un sistema di riscrittura degli URL integrato. Per i sistemi non Windows, il mod_rewrite di Apache è molto comune.

Ad esempio, una pagina wiki: http://server.com/wiki/Main_Page la richiesta viene gestita dal server web. E 'tradotto in /wiki/index.php?page=Main_Page

Ecco un esempio di riscrittura degli URL in 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] 

cosa dice questo è se l'URL che viene in è forum-##.html allora processo che richiesta, come se si trattasse di forumdisplay.php?fid=##. Lo stesso vale per le regole thread-##.html.

5

Gli URL sono in quel formato successivo a REST principles in cui tutto è una risorsa con un URL univoco.

Penso di aver letto da qualche parte nel blog che ciò si ottiene utilizzando ASP.NET MVC framework.

0

È possibile farlo in ASP.net utilizzando Context.RewritePath.

In Global.asax, creare un gestore di eventi Application.BeginRequest.

Per esempio, se si vuole fare richieste di

example.com/questions 

effettivamente restituire i risultati da

example.com/Questions/Default.aspx 

globale.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> 

Se il tuo sito web è in esecuzione nulla prima .NET Framework 4, sarà necessario attivare manualmente il runAllManagedModulesForAllRequests in web.config, altrimenti l'evento BeginRequest non verrà licenziato :

<configuration> 
... 
    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true" /> 
    </system.webServer> 
</configuration> 
Problemi correlati