Подтвердить что ты не робот

Как получить чистые URL-адреса, такие как Stackoverflow?

На некоторых веб-сайтах, управляемых .NET, не заканчиваются именами страниц asp.net, такими как default.aspx, вместо этого они используют шаблон http://sitename.com или http://sitename.com/subdirectory/subdirectory. Сайт отображается как подкаталоги с корня, т.е./теги,/пользователи,/значки, URL-адреса будут/теги,/пользователи и/значки соответственно.

StackOverflow, чтобы использовать конкретный пример, использует URL-адреса вопроса формы qaru.site/info/241903/.... Это отличный способ оптимизировать страницу для поисковых систем.

Выполняется ли это с помощью обработчиков HTTP? Запрошен ли запрос GET на основе пути, и весь ответ формируется в самом обработчике на основе идентификатора вопроса? Кто-нибудь еще должен спекулировать?

4b9b3361

Ответ 1

Это ASP.Net MVC, у которого есть .Net Routing более или менее встроенная. Маршрутизация доступна и для проектов без MVC, хотя

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

Это просто .dll, вы можете заглянуть в папку bin. В основном он использует регулярные выражения для соответствия вашему URL-адресу страницам/шаблонам.

Ответ 2

Это достигается с помощью mod_rewrite в Apache или аналогичных методов url_rewriting в IIS.

Примечание: SOFlow использует последнее.

Ответ 3

URL-адреса в этом формате следуют принципы REST, в которых все является ресурсом с уникальным URL-адресом.

Я думаю, что я где-то читал в блоге, что это достигается с помощью ASP.NET MVC framework.

Ответ 4

Я знаю, что Qaru использует структуру ASP.NET MVC, которая предположительно имеет встроенную систему перезаписи URL. Для системы, отличной от Windows, Apache mod_rewrite очень распространен.

Например, страница wiki: http://server.com/wiki/Main_Page обрабатывается веб-сервером. Он переведен в /wiki/index.php?page=Main_Page

Вот пример перезаписи URL-адресов в 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]

Что это говорит о том, что URL-адрес, который входит, forum-##.html, обрабатывает этот запрос так, как если бы он был forumdisplay.php?fid=##. То же самое относится к правилам thread-##.html.

Ответ 5

Вы можете сделать это в ASP.net, используя Context.RewritePath.

В Global.asax создайте Application.BeginRequest обработчик событий.

Например, если вы хотите сделать запросы

example.com/questions

действительно возвращают результаты из

example.com/info/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", "/info/Questions.aspx");
           Context.RewritePath(newPath);
       }
    }
</script>

Если на вашем веб-сайте что-то работает до .NET Framework 4, вам нужно вручную включить runAllManagedModulesForAllRequests в web.config, в противном случае BeginRequest событие не будет запущено:

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