Маршрутизация классических ASP запросов к .NET - SEO перенаправления - PullRequest
4 голосов
/ 23 октября 2009

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

Есть два не элегантных решения.

A) Поместите файл global.asa и выполните маршрутизацию через него.

B) Сопоставить файлы 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.

Заранее спасибо

Steve

Ответы [ 4 ]

4 голосов
/ 23 октября 2009

Большое редактирование: @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

1 голос
/ 13 августа 2010

Ответ Эдуардо Мольтени работает, кроме одной вещи. Это фактически передает браузеру 302 вместо 301.

Я верю вместо:

Context.Response.StatusCode = 301 
Context.Response.Redirect("/something/") 

должно быть:

Context.Response.StatusCode = 301 
Context.Response.RedirectLocation = "/something") 

response.redirect в основном прерывает то, что вы настраивали с помощью Response.StatusCode, и браузер в итоге получает "302 найдено".

Я не совсем уверен, как поисковые системы обрабатывают 302 против 301, так что, возможно, это не проблема. Тем не менее, мне кажется, что предпочтительнее было бы использовать перманентное перенаправление (301).

Для тех, кто на v4 платформы, кажется, есть новая опция:

Response.RedirectPermanent("/something")

Я не проверял это, но я предполагаю, что он предоставляет 301 в качестве кода состояния. Подробности здесь: HttpResponse.RedirectPermanent

1 голос
/ 23 октября 2009

Самое простое - использовать пользовательскую страницу с ошибкой 404 на уровне IIS. Эта страница может быть любой страницей ASPX; у вас есть доступ к исходному запросу через HttpContext.

В IIS 6.0 вы заметите, что по умолчанию URL-адреса, сопоставленные с механизмом .NET (.aspx, asmx и т. Д.), Используют собственный обработчик 404, определенный в web.config. Независимо от того; вы можете заставить даже эти страницы отправляться на страницу IIS 404, если вы отредактируете отображение механизма ASPX и убедитесь, что установлен флажок «файл должен существовать». Это перенаправляет все ссылки boken на обработчик IIS 404, даже если они сопоставлены с обработчиками .NET. Люди делают ошибку, пытаясь перенаправить все неработающие ссылки на web.config, определенный 404handler; это должно быть проще, если вы просто заставите всех перейти на IIS, определенный в одном экземпляре.

0 голосов
/ 24 октября 2009

Я использую модифицированную версию сценария Smart 404 Handler из http://evolvedcode.net/content/code_smart404/. Я добавил код, чтобы выполнить пользовательское отображение на основе таблицы в нашей базе данных.

Этот сценарий можно легко переписать в ASP.NET, а затем сопоставить таким же образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...