Routage des demandes ASP classiques vers .NET - Redirections SEO
-
06-07-2019 - |
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
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.
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:
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.