Как получить чистые URL-адреса, такие как Stackoverflow?
На некоторых веб-сайтах, управляемых .NET, не заканчиваются именами страниц asp.net, такими как default.aspx, вместо этого они используют шаблон http://sitename.com или http://sitename.com/subdirectory/subdirectory. Сайт отображается как подкаталоги с корня, т.е./теги,/пользователи,/значки, URL-адреса будут/теги,/пользователи и/значки соответственно.
StackOverflow, чтобы использовать конкретный пример, использует URL-адреса вопроса формы qaru.site/info/241903/.... Это отличный способ оптимизировать страницу для поисковых систем.
Выполняется ли это с помощью обработчиков HTTP? Запрошен ли запрос GET на основе пути, и весь ответ формируется в самом обработчике на основе идентификатора вопроса? Кто-нибудь еще должен спекулировать?
Ответы
Ответ 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>