Как получить чистые URL, такие как переполнение стека? - PullRequest
22 голосов
/ 24 июня 2009

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

Переполнение стека, если использовать конкретный пример, использует URL-адреса вопросов в форме Как получить чистые URL-адреса, такие как Stackoverflow? . Какой отличный способ оптимизировать страницу для поисковых систем.

Это реализовано с использованием обработчиков HTTP? Отфильтрован ли запрос GET по пути, и весь ответ формируется в самом обработчике на основе идентификатора вопроса? Кто-нибудь еще хочет размышлять?

Ответы [ 5 ]

23 голосов
/ 24 июня 2009

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

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

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

18 голосов
/ 24 июня 2009

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

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

5 голосов
/ 24 июня 2009

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

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

3 голосов
/ 24 июня 2009

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

Например, страница вики: 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 правил.

0 голосов
/ 04 апреля 2016

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

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

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

example.com/questions

фактически возвращает результаты от

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>

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

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