Como obter URLs limpas como Stack Overflow?
-
10-07-2019 - |
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?
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>