Маршрутизация классических запросов ASP в .NET — SEO-перенаправления
-
06-07-2019 - |
Вопрос
Мы заменяем старый классический веб-сайт ASP решением .NET 3.5.
Нам нужно перенаправить все классические запросы ASP на страницы aspx (т.contactus.asp теперь может направляться в /contact-us/default.aspx).Мне бы хотелось, чтобы запросы попадали в global.asax, чтобы я мог сделать что-то вроде
If url == "bob.asp"
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location", SiteConfig.SiteURL + redirectUrl);
End If
Есть два неэлегантных решения.
А) Поместите файл global.asa и выполните маршрутизацию через него.
Б) Сопоставьте файлы asp с движком .NET.Отлично, но тогда, если нам понадобится разместить на наших сайтах классические сайты ASP, IIS будет отправлять запросы не в то место.
Я нашел хорошее решение здесь
http://forums.asp.net/p/1202225/3458901.aspx
В котором говорилось, что что-то подобное может сработать...
<buildProviders>
<add extension=".php" type="System.Web.Compilation.PageBuildProvider" />
</buildProviders>
<httpHandlers>
<add verb="*" path="*.php" type="System.Web.UI.PageHandlerFactory" validate="True" />
</httpHandlers>
Этот пример был для php, но я предполагаю, что то же самое будет работать и для asp.Однако после изменения .php на .asp в примере и размещения тегов в правильной части web.config у меня нет радости (на самом деле это ошибка сервера 500).
Может ли кто-нибудь пролить свет на этот вопрос или дать мне элегантное решение.
Было ощущение, что приведенное выше решение не будет работать для php или asp, поскольку IIS направит запрос до того, как он попадет в движок .NET.
заранее спасибо
Стив
Решение
Большое редактирование: @EdSF в комментариях указал мне, что ответ неправильный.В недоумении я проверил с помощью Firebug, и действительно: это было не правильно.
Вам нужно использовать Context.Response.RedirectLocation
чтобы код состояния работал.
Я делаю то же самое в global.asax:
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As System.EventArgs)
Dim fullOriginalpath As String = Request.Url.ToString.ToLower
If (fullOriginalpath.Contains("/verarticulo.asp?articuloid=")) Then
Context.Response.StatusCode = 301
''// this does not work, returns a 302
''//Context.Response.Redirect("/noticias/" + getIDFromPath(fullOriginalpath))
''// this does right way
Context.Response.RedirectLocation = "/noticias/" + getIDFromPath(fullOriginalpath)
Context.Response.End()
ElseIf (fullOriginalpath.Contains("/archivo.asp")) Then
Context.Response.StatusCode = 301
Context.Response.RedirectLocation = "/archivo/"
Context.Response.End()
ElseIf (fullOriginalpath.EndsWith("/default.asp")) Then
Context.Response.StatusCode = 301
Context.Response.RedirectLocation = "/"
Context.Response.End()
End If
End Sub
Единственное, что вам нужно сделать, если вы используете II6, вы должны настроить этот фильтр ISAPI таким образом:
Файл c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll
Другие советы
Самое простое — использовать собственную страницу ошибки 404 на уровне IIS.Этой страницей может быть любая страница ASPX;у вас есть доступ к исходному запросу через HttpContext.
В IIS 6.0 вы заметите, что по умолчанию URL-адреса, сопоставленные с механизмом .NET (.aspx, asmx и т. д.), используют собственный обработчик 404, определенный в web.config.Независимо от того;вы можете отправить даже эти страницы на страницу IIS 404, если отредактируете сопоставление механизма ASPX и убедитесь, что установлен флажок «файл должен существовать».Это перенаправляет все боковые ссылки на обработчик IIS 404, даже если они сопоставлены с обработчиками .NET.Люди совершают ошибку, пытаясь перенаправить все неработающие ссылки на обработчик 404, определенный в web.config;будет проще, если вы просто заставите всех перейти к определенному IIS одним потоком.
Ответ Эдуардо Молтени работает, за исключением одного.Фактически он передает браузеру 302 вместо 301.
Я верю вместо:
Context.Response.StatusCode = 301
Context.Response.Redirect("/something/")
должен быть:
Context.Response.StatusCode = 301
Context.Response.RedirectLocation = "/something")
response.redirect по сути прерывает то, что вы настраивали с помощью Response.StatusCode, и браузер в конечном итоге получает сообщение «302 Found».
Я не совсем уверен, как поисковые системы обрабатывают 302 или 301, так что, возможно, это не проблема.Однако мне кажется, что настоящее постоянное перенаправление (301) было бы предпочтительнее.
Для тех, кто использует v4 платформы, похоже, есть новая опция:
Response.RedirectPermanent("/something")
Я не проверял это, но предполагаю, что в качестве кода состояния отображается 301.Подробности здесь: HttpResponse.RedirectPermanent
Я использую модифицированную версию скрипта Smart 404 Handler от http://evolvedcode.net/content/code_smart404/.Я добавил код для создания собственного сопоставления на основе таблицы в нашей базе данных.
Этот сценарий можно легко переписать на ASP.NET, а затем отобразить таким же образом.