Pergunta

Em alguns sites impulsionado .NET URLs não terminam com nomes de página asp.net, como default.aspx, em vez disso, usar um padrão de http://sitename.com ou http://sitename.com/subdirectory/subdirectory. O local é mapeado como sub-directórios fora da raiz, ou seja. / tags, / usuários, / emblemas, as URLs seria / tags / usuários, / emblemas, respectivamente.

Stack Overflow, para usar um exemplo específico, usa URLs questão da forma como obter URLs limpas como Stackoverflow? . Que é ótima maneira de otimizar a página para os motores de busca.

Esta é uma implementados usando manipuladores HTTP? É o pedido GET filtrado com base no caminho e toda a resposta é formado no próprio manipulador baseado no id pergunta? Qualquer um cuidado mais para especular?

Foi útil?

Solução

É do ASP.Net MVC, que tem o .Net Routing mais ou menos construído em. O roteamento está disponível para projectos não MVC, bem como, embora

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

É apenas uma .dll você pode cair na pasta bin. Basicamente, ele usa expressões regulares para corresponder ao seu URL da páginas / templates.

Outras dicas

Isto é conseguido com mod_rewrite em Apache, ou métodos semelhantes de url_rewriting no IIS .

Nota: SOFlow usa o último

.

As URLs estão nesse formato seguinte princípios do REST em que tudo é um recurso com uma única URL.

Eu acho que eu li em algum lugar do blog que isto é conseguido usando quadro ASP.NET MVC .

Eu sei que Stack Overflow está usando a estrutura ASP.NET MVC, que presumivelmente tem um sistema de reescrita de URL embutido. Para o sistema não-Windows, Apache mod_rewrite é muito comum.

Por exemplo, uma página wiki: pedido http://server.com/wiki/Main_Page é manuseado pelo servidor. É traduzida para /wiki/index.php?page=Main_Page

Aqui está um exemplo de URL reescrita em 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]

O que isto diz é se o URL que vem em é forum-##.html então processar esse pedido como se fosse forumdisplay.php?fid=##. O mesmo vale para as regras thread-##.html.

Você pode fazê-lo em ASP.net usando Context.RewritePath .

Em Global.asax , crie um Application.BeginRequest manipulador de eventos / .

Por exemplo, se você quiser fazer pedidos de

example.com/questions

realmente retornar os 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>

Se o seu web-site está funcionando nada antes de .NET Framework 4, você terá que ligar manualmente a runAllManagedModulesForAllRequests em web.config , caso contrário, o BeginRequest vontade evento não ser demitido:

<configuration>
...
   <system.webServer>
      <modules runAllManagedModulesForAllRequests="true" />
   </system.webServer>
</configuration>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top