Pergunta

Estamos substituindo um velho site asp clássico com uma solução .NET 3.5.

Precisamos redirecionar todas as solicitações ASP clássicos para páginas aspx (ou seja contactus.asp, pode agora rota para /contact-us/default.aspx). O que eu woudl como é para os pedidos para global.asax hit para que eu possa fazer algo como

If url == "bob.asp"
    Response.Status = "301 Moved Permanently";
    Response.AddHeader("Location", SiteConfig.SiteURL + redirectUrl);
End If

Existem duas soluções deselegantes.

A) Coloque um arquivo global.asa e fazer o encaminhamento por isso.

B) Mapa arquivos ASP para o motor .NET. Grande, mas, em seguida, se precisamos locais clássico asp acolhimento em nossos sites IIS estará enviando os pedidos para o lugar errado.

Eu encontrei uma solução agradável aqui

http://forums.asp.net/p/1202225/3458901.aspx

Que algo declarado como isso pode funcionar ...

<buildProviders>

<add extension=".php" type="System.Web.Compilation.PageBuildProvider" />

</buildProviders>
<httpHandlers>

<add verb="*" path="*.php" type="System.Web.UI.PageHandlerFactory" validate="True" />

</httpHandlers>

Este exemplo foi para php, mas eu assumo a mesma coisa iria trabalhar para asp. No entanto depois de mudar .php para asp no exemplo e colocar as etiquetas na parte correta do web.config que estou tendo nenhuma alegria (um erro de 500 servidor na verdade).

Alguém pode lançar alguma luz sobre este ou me dar uma solução elegante.

tinha a sensação da solução de trabalho não tomaria acima para php ou asp como IIS irá ter encaminhado o pedido antes que ele chegue ao motor .NET.

Agradecemos antecipadamente

Steve

Foi útil?

Solução

Big edit: Foi-me indicado por @EdSF nos comentários que a resposta estava errada. Em descrença eu verifiquei usando o Firebug, e, de fato, que era errado .

Você precisa usar Context.Response.RedirectLocation para o código de status de trabalho.

enter descrição da imagem aqui


Eu estou fazendo o mesmo em 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

A única coisa que você tem que fazer se você estiver usando II6 você tem que configurar esse filtro ISAPI desta forma:

enter descrição da imagem aqui

O arquivo é c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll

Outras dicas

A coisa mais simples é usar uma página de erro 404 personalizada no nível do IIS. Esta página pode ser qualquer página ASPX; você tem acesso à solicitação original através do HttpContext.

Em IIS 6.0, você notará que por URLs padrão mapeados para o motor NET (.aspx ,, asmx etc) usam seu próprio 404 manipulador definido em web.config. Não importa; você pode causar até mesmo aquelas páginas a serem enviadas para a página 404 do IIS se você editar o mapeamento do motor ASPX e garantir que a caixa de seleção para "arquivo deve existir" é definido. Isso redireciona todos os links BOKEN a 404 manipulador IIS, mesmo se eles são mapeados para manipuladores .NET. As pessoas cometem o erro de tentar redirecionar todos os links quebrados ao web.config definido 404handler; -lo da obrigação mais fácil se você apenas forçar tudo para ir para o IIS definido um instread.

obras resposta de Eduardo Molteni, exceto por uma coisa. Ele realmente passa o navegador de um 302 em vez de um 301.

Eu acredito em vez de:

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

que deve ser:

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

O response.redirect é basicamente interromper o que estavam montando com o Response.StatusCode e as extremidades do navegador até a obtenção de um "302 Found".

Eu não estou realmente certo de como os motores de busca lidar com uma 302 vs um 301, então talvez não um problema. Parece-me que embora um verdadeiro redirecionamento permanente (301) seria preferível.

Para aqueles em v4 do quadro, parece haver uma nova opção:

Response.RedirectPermanent("/something")

Eu não testei isso, mas eu estou supondo que ele fornece um 301 como o código de status. Detalhes aqui: HttpResponse.RedirectPermanent

Eu uso uma versão modificada do script Handler Inteligente 404 de http://evolvedcode.net/content/ code_smart404 / . Eu adicionei código para fazer o mapeamento personalizado com base de uma tabela em nosso banco de dados.

Este script poderia facilmente ser re-escrito em ASP.NET e depois mapeados da mesma forma.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top