2009-06-23 16 views
21

En algunos sitios .NET las URL no terminan con los nombres de página asp.net, como default.aspx, sino que usan un patrón http://sitename.com o http://sitename.com/subdirectory/subdirectory. El sitio está mapeado como subdirectorios de la raíz, es decir./tags,/users,/badges, las URL serían/​​tags,/users,/badges respectivamente.¿Cómo obtener URLs limpias como Stack Overflow?

Desbordamiento de pila, para usar un ejemplo específico, utiliza URL de pregunta del formulario How do get clean URLs like Stackoverflow?. Que es una gran manera de optimizar la página para los motores de búsqueda.

¿Se implementa esto utilizando controladores HTTP? ¿La solicitud GET se filtra en función de la ruta y toda la respuesta se forma en el controlador en función de la identificación de la pregunta? ¿Alguien más se preocupa por especular?

+4

Esta pregunta se ha hecho tantas veces antes. –

+0

Creo que el desbordamiento de pila se construye utilizando el marco ASP.NET MVC, consulte www.asp.net/mvc – Charlie

+5

Elimine las referencias SO y esta es una gran pregunta. –

Respuesta

21

Es ASP.Net MVC, que tiene el enrutamiento .Net más o menos integrado. El enrutamiento está disponible para proyectos no MVC así, aunque

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

Es sólo una .dll que pueda colocar en su carpeta bin. Básicamente, utiliza expresiones regulares para unir las URL a las páginas/plantillas.

+1

A partir de ASP.NET 4.0, está disponible una mejor integración de enrutamiento de URL para formularios web, anunciada a fines de 2009: [Enrutamiento de URL con formularios web ASP.NET 4 (VS 2010 y .NET 4.0 Series) - Blog de 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

Esto se logra con mod_rewrite en Apache, o métodos similares de url_rewriting on IIS.

Nota: SOFlow utiliza este último.

+2

¿Por qué votar abajo? – Sampson

+0

Probablemente porque está bien documentado que el sitio no usa Apache. –

+7

¿Dije que usa Apache? No. El autor de la pregunta estaba interesado en cómo funcionan las URL. Él no especificó que estaba interesado en cómo funcionan desde una perspectiva .NET. Ofrecí una respuesta para Apache e IIS. – Sampson

3

Sé que Stack Overflow utiliza el marco ASP.NET MVC, que presumiblemente tiene incorporado un sistema de reescritura de URL. Para sistemas que no son de Windows, Apache mod_rewrite es muy común.

Por ejemplo, una página wiki: http://server.com/wiki/Main_Page la solicitud es manejada por el servidor web. Se traduce en /wiki/index.php?page=Main_Page

He aquí un ejemplo de reescritura de URL en 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] 

Lo que esto dice es que si la URL que viene en forum-##.html es entonces el proceso que lo soliciten como si fuera forumdisplay.php?fid=##. Lo mismo ocurre con las reglas thread-##.html.

5

Las URL están en ese formato después de REST principles en el que todo es un recurso con una URL única.

Creo que leí en algún lugar del blog que esto se logra usando ASP.NET MVC framework.

0

Puede hacerlo en ASP.net utilizando Context.RewritePath.

En Global.asax, cree un controlador de eventos Application.BeginRequest.

Por ejemplo, si desea realizar peticiones de

example.com/questions 

realidad devolver los resultados 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 su sitio web está funcionando nada antes de .NET Framework 4, tendrá que activar manualmente el runAllManagedModulesForAllRequests en web.config, de lo contrario el caso BeginRequest no será despedida :

<configuration> 
... 
    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true" /> 
    </system.webServer> 
</configuration> 
Cuestiones relacionadas