Маршрутизация классических запросов ASP в .NET — SEO-перенаправления

StackOverflow https://stackoverflow.com/questions/1614714

Вопрос

Мы заменяем старый классический веб-сайт 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 чтобы код состояния работал.

enter image description here


Я делаю то же самое в 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 таким образом:

enter image description here

Файл 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, а затем отобразить таким же образом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top