Question

Nous remplaçons un ancien site Web asp classique par une solution .NET 3.5.

Nous devons rediriger toutes les requêtes ASP classiques vers des pages aspx (c'est-à-dire que contactus.asp peut désormais être dirigé vers /contact-us/default.aspx). Ce que je voudrais, c’est que les requêtes soient adressées à global.asax pour pouvoir faire quelque chose comme

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

Il existe deux solutions inélégantes.

A) Placez un fichier global.asa et faites le routage à travers celui-ci.

B) Mappez les fichiers asp sur le moteur .NET. Bien, mais si nous devons héberger des sites ASP classiques sur nos sites, IIS enverra les demandes au mauvais endroit.

J'ai trouvé une bonne solution ici

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

Qui a déclaré que quelque chose comme cela pourrait fonctionner ...

<buildProviders>

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

</buildProviders>
<httpHandlers>

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

</httpHandlers>

Cet exemple était pour php mais je suppose que la même chose fonctionnerait pour asp. Cependant, après avoir changé .php en .asp dans l'exemple et placé les balises dans la partie correcte de web.config, je n'ai pas de joie (une erreur de 500 serveur en fait).

Quelqu'un peut-il m'éclairer ou me proposer une solution élégante?

Si vous aviez l’impression que la solution ci-dessus ne fonctionnerait pas pour php ou asp car IIS aura acheminé la demande avant qu’elle parvienne au moteur .NET.

Merci d'avance

Steve

Était-ce utile?

La solution

Gros montage: @EdSF m'a fait remarquer dans les commentaires que la réponse était fausse. Avec incrédulité, j’ai vérifié en utilisant Firebug et, en fait, c’était faux .

Vous devez utiliser Context.Response.RedirectLocation pour que le code d'état fonctionne.

entrer la description de l'image ici

Je fais la même chose dans 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

La seule chose à faire si vous utilisez II6 est de configurer ce filtre ISAPI. de cette façon:

entrer la description de l'image ici

Le fichier est c: \ windows \ microsoft.net \ framework \ v2.0.50727 \ aspnet_isapi.dll

Autres conseils

Le plus simple est d’utiliser une page d’erreur 404 personnalisée au niveau IIS. Cette page peut être n’importe quelle page ASPX; vous avez accès à la demande initiale via HttpContext.

Dans IIS 6.0, vous remarquerez que par défaut, les URL mappées sur le moteur .NET (.aspx, asmx, etc.) utilisent leur propre gestionnaire 404 défini dans web.config. Peu importe; vous pouvez même envoyer ces pages à la page IIS 404 si vous modifiez le mappage du moteur ASPX et assurez-vous que la case à cocher du fichier doit obligatoirement exister " est réglé. Cela redirige tous les liens boken vers le gestionnaire IIS 404, même s'ils sont mappés à des gestionnaires .NET. Les gens font l'erreur d'essayer de rediriger tous les liens rompus vers le gestionnaire 404 défini par web.config; c’est plus facile si vous forcez tout pour aller à l’IIS défini par un seul instread.

La réponse d'Eduardo Molteni fonctionne, sauf pour une chose. En fait, il transmet au navigateur un 302 au lieu d'un 301.

Je crois au lieu de:

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

il devrait être:

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

Le response.redirect interrompt fondamentalement ce que vous étiez en train de configurer avec Response.StatusCode et le navigateur finit par obtenir un "302 trouvés".

Je ne sais pas trop comment les moteurs de recherche traitent un 302 contre un 301, alors peut-être que ce n'est pas un problème. Il me semble cependant qu'une véritable redirection permanente (301) serait préférable.

Pour ceux qui utilisent la v4 du framework, il semble y avoir une nouvelle option:

Response.RedirectPermanent("/something")

Je n’ai pas testé cela, mais je suppose qu’il fournit un 301 comme code d’état. Détails ici: HttpResponse.RedirectPermanent

J'utilise une version modifiée du script Smart 404 Handler de http://evolvedcode.net/content/ code_smart404 / . J'ai ajouté du code pour créer un mappage personnalisé basé sur une table de notre base de données.

Ce script pourrait facilement être réécrit dans ASP.NET, puis mappé de la même manière.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top