Pregunta

En algunos sitios controlados por .NET, las URL no terminan con 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 se asigna como subdirectorios fuera de la raíz, es decir. / tags, / users, / badges, las URL serían / ??tags, / users, / badges respectivamente.

Stack Overflow, para usar un ejemplo específico, usa URL de preguntas con el formato ¿Cómo obtener URL limpias como Stackoverflow? . Lo cual es una excelente manera de optimizar la página para los motores de búsqueda.

¿Se implementa esto utilizando controladores HTTP? ¿Se filtra la solicitud GET 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? ¿A alguien más le importa especular?

¿Fue útil?

Solución

Es ASP.Net MVC, que tiene el enrutamiento .Net más o menos integrado. El enrutamiento también está disponible para proyectos que no son MVC

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

Es solo un .dll que puede colocar en su carpeta bin. Básicamente, utiliza expresiones regulares para hacer coincidir sus URL con páginas / plantillas.

Otros consejos

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

Nota: SOFlow usa este último.

Las URL están en ese formato siguiendo principios REST en el que todo es un recurso con un URL única.

Creo que leí en alguna parte del blog que esto se logra utilizando Framework ASP.NET MVC .

Sé que Stack Overflow está utilizando el marco ASP.NET MVC, que presumiblemente tiene un sistema de reescritura de URL incorporado. 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 solicitud es manejada por el servidor web. Está traducido a /wiki/index.php?page=Main_Page

Aquí hay 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 es forum - ##. html , procese esa solicitud como si fuera forumdisplay.php? fid = ## . Lo mismo ocurre con las reglas thread - ##. Html .

Puede hacerlo en ASP.net utilizando Context.RewritePath .

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

Por ejemplo, si desea realizar solicitudes de

example.com/questions

en realidad devuelve 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 ejecuta algo antes de .NET Framework 4, deberá activar manualmente el runAllManagedModulesForAllRequests en web.config , de lo contrario, el El evento BeginRequest no se activará:

<configuration>
...
   <system.webServer>
      <modules runAllManagedModulesForAllRequests="true" />
   </system.webServer>
</configuration>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top