2009-10-23 6 views
4

Nous remplaçons un ancien site Web ASP classique par une solution .NET 3.5.Routage des requêtes ASP classiques vers .NET - Redirections SEO

Nous devons rediriger toutes les demandes ASP classiques vers des pages aspx (c'est-à-dire contactus.asp, peut maintenant acheminer vers /contact-us/default.aspx). Ce que je conseillerai aime est pour les demandes de frapper global.asax je peux faire quelque chose comme

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

Il y a deux solutions inélégant.

A) Placez un fichier global.asa et effectuez le routage par ce biais.

B) Mappez les fichiers ASP sur le moteur .NET. Génial, 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

Ce qui a dit quelque chose comme ça peut 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 a été pour php mais je suppose que la même chose fonctionnerait pour aspic. Cependant, après avoir changé .php en .asp dans l'exemple et en plaçant les balises dans la partie correcte du web.config je n'ai pas de joie (une erreur de 500 serveurs en fait).

Quelqu'un peut-il faire la lumière sur ce sujet ou me donner une solution élégante.

J'avais l'impression que la solution ci-dessus ne fonctionnerait pas pour php ou asp car IIS aura acheminé la requête avant qu'elle n'atteigne le moteur .NET.

Merci à l'avance

Steve

+0

quelle version d'IIS utilisez-vous? – ScottE

Répondre

4

Big edit: J'ai été pointé par @EdSF dans les commentaires que la réponse était erronée. En 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.

enter image description here


que je fais la même chose dans le monde.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 que vous devez faire si vous utilisez II6 vous devez configurer ce filtre ISAPI de cette façon:

enter image description here

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

+0

Merci pour la réponse détaillée. Essayons de le faire de cette façon - merci pour toutes les réponses des gens! – CountZero

+0

Le context.reponse.redirect ne renverrait-il pas le 301 (Permanent 301 vs temporaire 302)? – EdSF

+0

@EdSF: non, vous pouvez indiquer explicitement le code d'état de la redirection. –

1

La chose la plus simple est d'utiliser une page d'erreur 404 au niveau IIS. Cette page peut être n'importe quelle page ASPX; vous avez accès à la demande d'origine via le HttpContext.

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

+0

Nous avons également tendance à suivre cette voie, bien que nous définissions généralement le gestionnaire 404 dans IIS et dans web.config pour pointer vers la même page ASPX. Cette page parle ensuite à une base de données de mappings (old/vanity/etc urls à de nouvelles urls). –

0

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

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

1

La réponse d'Eduardo Molteni fonctionne, sauf pour une chose. Il passe en fait le navigateur 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 essentiellement ce que vous établissiez avec le Response.StatusCode et le navigateur finit par obtenir un "302 Found".

Je ne suis pas vraiment sûr de la façon dont les moteurs de recherche traitent un 302 par rapport à un 301, donc ce n'est peut-être pas un problème. Il me semble cependant qu'une vraie redirection permanente (301) serait préférable.

Pour ceux v4 du cadre, il semble y avoir une nouvelle option:

Response.RedirectPermanent("/something") 

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

+0

Juste examiné la réponse par @EdSF demande –

Questions connexes