Domanda

Stiamo sostituendo un vecchio sito Web ASP classico con una soluzione .NET 3.5.

Dobbiamo reindirizzare tutte le richieste ASP classiche alle pagine aspx (ovvero contactus.asp, ora può essere indirizzato a /contact-us/default.aspx). Ciò che mi piacerebbe è che le richieste colpiscano global.asax in modo che io possa fare qualcosa del genere

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

Esistono due soluzioni non eleganti.

A) Posiziona un file global.asa ed esegui il routing attraverso quello.

B) Mappa i file asp sul motore .NET. Fantastico, ma se abbiamo bisogno di ospitare siti ASP classici sui nostri siti IIS invierà le richieste nel posto sbagliato.

Ho trovato una bella soluzione qui

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

Che ha affermato che qualcosa del genere potrebbe funzionare ...

<buildProviders>

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

</buildProviders>
<httpHandlers>

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

</httpHandlers>

Questo esempio era per php ma suppongo che la stessa cosa funzionerebbe per asp. Tuttavia, dopo aver modificato .php in .asp nell'esempio e aver inserito i tag nella parte corretta di web.config non ho alcuna gioia (in realtà un errore del server 500).

Qualcuno può far luce su questo o darmi una soluzione elegante.

Ho avuto la sensazione che la soluzione di cui sopra non avrebbe funzionato per php o asp poiché IIS avrebbe instradato la richiesta prima che arrivasse al motore .NET.

Grazie in anticipo

Steve

È stato utile?

Soluzione

Modifica grande: sono stato segnalato da @EdSF nei commenti che la risposta era sbagliata. Incredulamente ho controllato usando Firebug e, di fatto, era sbagliato .

Devi utilizzare Context.Response.RedirectLocation per far funzionare il codice di stato.

inserisci qui la descrizione dell'immagine


Sto facendo lo stesso in 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

L'unica cosa che devi fare se stai usando II6 devi configurare questo filtro ISAPI in questo modo:

inserisci qui la descrizione dell'immagine

Il file è c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll

Altri suggerimenti

La cosa più semplice è utilizzare una pagina di errore 404 personalizzata a livello di IIS. Questa pagina può essere qualsiasi pagina ASPX; hai accesso alla richiesta originale tramite HttpContext.

In IIS 6.0, noterai che per impostazione predefinita gli URL mappati al motore .NET (.aspx ,, asmx ecc.) usano il loro gestore 404 definito in web.config. Non importa; puoi fare in modo che anche quelle pagine vengano inviate alla pagina IIS 404 se modifichi la mappatura del motore ASPX e assicuri che la casella di spunta per " file debba esistere " è impostato. Ciò reindirizza tutti i collegamenti di boken al gestore IIS 404, anche se sono mappati ai gestori .NET. Le persone commettono l'errore di provare a reindirizzare tutti i collegamenti interrotti al gestore 404 definito da web.config; deve essere più semplice se si obbliga tutti a passare all'IIS definito in un unico comando.

La risposta di Eduardo Molteni funziona, tranne una cosa. In realtà passa al browser un 302 anziché un 301.

Credo invece di:

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

dovrebbe essere:

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

Response.redirect sostanzialmente interrompe ciò che stavi impostando con Response.StatusCode e il browser finisce per ottenere un "302 trovato".

Non sono davvero sicuro di come i motori di ricerca gestiscano un 302 contro un 301, quindi forse non è un problema. Mi sembra però che sarebbe preferito un vero reindirizzamento permanente (301).

Per quelli su v4 del framework, sembra esserci una nuova opzione:

Response.RedirectPermanent("/something")

Non l'ho provato, ma suppongo che fornisca un 301 come codice di stato. Dettagli qui: HttpResponse.RedirectPermanent

Uso una versione modificata dello script del gestore Smart 404 da http://evolvedcode.net/content/ code_smart404 / . Ho aggiunto il codice per eseguire il mapping personalizzato basato su una tabella nel nostro database.

Questo script può essere facilmente riscritto in ASP.NET e quindi mappato allo stesso modo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top