Как получить чистые URL-адреса, такие как Stack Overflow?
-
10-07-2019 - |
Вопрос
На некоторых сайтах, управляемых .NET, URL-адреса не заканчиваются на asp.net имена страниц, такие как default.aspx, вместо этого они используют шаблон http://sitename.com или http://sitename.com/subdirectory/subdirectory.Сайт отображается как подкаталоги вне корневого каталога, т.е./tags, /users, /badges, URL-адресами будут /tags, /users, /badges соответственно.
Stack Overflow, если использовать конкретный пример, использует URL-адреса вопросов вида Как получить чистые URL-адреса, такие как Stackoverflow?.Это отличный способ оптимизировать страницу для поисковых систем.
Реализовано ли это с помощью HTTP-обработчиков?Фильтруется ли запрос GET на основе path, и весь ответ формируется в самом обработчике на основе идентификатора вопроса?Кто-нибудь еще хочет порассуждать?
Решение
Это ASP.Net MVC, в котором более или менее встроена .Net Routing. Маршрутизация доступна и для не MVC проектов, хотя
http://msdn.microsoft.com/en-us/library/ cc668201.aspx р>
Это просто .dll, которую вы можете поместить в папку bin. В основном он использует регулярные выражения для сопоставления ваших URL со страницами / шаблонами.
Другие советы
Это достигается с помощью mod_rewrite в Apache или аналогичных методов url_rewriting в IIS .
Примечание. SOFlow использует последнее.
URL-адреса имеют такой формат в соответствии с принципами REST , в которых все является ресурсом с уникальный URL.
Мне кажется, я где-то читал в блоге, что это достигается с помощью ASP.NET MVC framework . р>
Я знаю, что переполнение стека использует инфраструктуру 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
.
Вы можете сделать это в ASP.net, используя Context.RewritePath
.
В Глобальный.asax, создать Заявка.Начать запрос обработчик событий.
Например, если вы хотите отправлять запросы на
example.com/questions
фактически возвращает результаты из
example.com/Questions/Default.aspx
Глобальный.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, в противном случае Начальный запрос событие не будет запущено:
<configuration>
...
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
</configuration>