2011-01-14 3 views
0

Oder das Gegenteil, wie kann ich eine URL nur dann umschreiben, wenn sie nicht existiert? zB abfangen 404s.Wie kann ich mit ISAPI-Rewrite eine URL nur dann umschreiben, wenn die umgeschriebene Ziel-URL existiert?

Hier ist der Kontext: Wir migrieren langsam unsere Website von ASP Classic nach ASP.NET. Mit "langsam" meine ich das Konvertieren von 9000+ ASP-Seiten pro Seite nach ASPX.

Während dies zu tun wir alle defekten Verbindungen sowie nicht zu verlieren alle Rankings in den Suchmaschinen verhindern wollen. Das bedeutet, dass alle unsere ASP-URLs weiterhin bestehen müssen, obwohl sie von ASPX-Seiten bereitgestellt werden.

Was ich gerne tun könnte, ist mit ISAPI-Rewrite-Regel (en), die .asp -> .aspx neu schreiben, es sei denn, die Ziel-URL existiert nicht wirklich in diesem Fall würde es einfach ausführen und zurückgeben. Asp.

Wenn wir also somepage.asp nicht konvertiert haben noch zu .aspx, würde die URL nicht erhalten neu geschrieben und somepage.asp würde angezeigt werden. Sobald sapage.asp verschwunden ist, wird die URL in somepage.aspx umgeschrieben, die ausgeführt und zurückgegeben wird, aber der Webbrowser/die Suchmaschine würde denken, dass sie somepage.asp erhalten hat.

An einem gewissen Punkt in der Zukunft würden wir die canonical url in den ASPX-Seiten gesetzt und die Suchmaschinen auf ihrer Bequemlichkeit aufholen lassen.

Hinweis: Ich habe mit der Verwendung eines benutzerdefinierten 404 auf IIS experimentiert, um das Dateisystem zu überprüfen und einen Server.Transfer auszuführen, wenn die Zielaspx-Seite vorhanden ist, jedoch nicht von asp classic auf asp.net übertragen werden kann. (Sie erhalten "Die angegebene 'Page Language =" C# "' Option ist unbekannt oder ungültig. Fehler '8000d001'") Die einzige Möglichkeit, dies würde funktionieren, wenn wir eine 301/302 Redirect statt der Server.Transfer und das ist unerwünscht für uns zu dieser Zeit. (Management ist paranoid und sagt keine Option.)

+0

Um eine 404 zu finden, muss eine Web-Anfrage erstellt werden, und das ist etwas, das ISApi-Rewrite nicht für Sie tun wird. Die einzige Möglichkeit, die ich mir vorstellen kann, ist, dass Sie ASP-Dateien einzeln manuell zur ini-Datei hinzufügen, während Sie sie konvertieren. –

+0

Oder, wenn Dinge in Ordnern sind (hoffentlich für 9.000+ Seite Website sie sind), dann können Sie es 1 Ordner auf einmal tun. –

+0

@Chris Es gibt in der Tat viele Ordner, aber einige von ihnen enthalten viele Tausende von Seiten, was es unrealistisch macht, wenn man Personal und Zeit unterliegt, dass wir uns verpflichten können, ein ganzes Verzeichnis gleichzeitig zu erstellen. –

Antwort

0

Ich habe es herausgefunden. Wie Chris Haas vorgeschlagen hat, wenn ich meinen 404-Handler zu einer ASPX-Seite mache, kann ich einen Server.Transfer ausführen, wenn die Zielseite existiert, und wenn nicht, fall einfach durch und lasse den regulären 404-Status zurückgeben. So etwas wie folgt aus:

<%@ Page Language="c#" %> 

<%@ Import Namespace="System.IO" %> 
<script RunAt="server"> 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     String requestedUrl = Request.ServerVariables["HTTP_X_REWRITE_URL"]; 

     if (requestedUrl.EndsWith(".asp", StringComparison.CurrentCultureIgnoreCase)) { 
      String targetUrl = requestedUrl + "x"; 
      String targetPath = Server.MapPath(targetUrl); 

      if (File.Exists(targetPath)) { 
       Server.Transfer(targetUrl); 
      } 
     } 
     Response.Status = "404 Not Found"; 
    } 

</script> 

Ich muss noch mit querystrings testen, aber bisher behandelt sie jeden Fall perfekt. Wenn die Zeit gekommen ist und das Management damit einverstanden ist, hören wir einfach auf, den Server auszuführen. Transferieren Sie ihn und ändern Sie ihn in ein 301 Moved Permanently. Da IIS Fehlerseiten pro Verzeichnis setzen kann, können wir sogar etwas selektiv sein, wenn wir es tun.

Übrigens sieht es aus wie ISAPI_Rewrite 3 könnte eine Datei überprüft Option, die auch gearbeitet haben könnte, aber wir nur v2 auf unserem Server haben.

0

Persönlich, wenn der Inhalt sich bewegt, möchten Sie einen Prozess schreiben, der eine 301-Weiterleitung ausführt, um anzuzeigen, dass die Seite an einen neuen Speicherort verschoben wurde. So ist es wirklich.

Dies würde sicherstellen, dass der neue Inhalt indiziert und entsprechend verknüpft wird.

+0

301/302 Redirect ist keine Option, da das Management nicht bereit ist, unser Ranking zu riskieren. –

+0

Es gibt einen großen Unterschied zwischen 301 und 302, der erste ist permanent, der zweite ist temporär. 301 sollte Ihre Rankings beibehalten und die SE darüber informieren, dass sich der Content-Standort verschoben hat. Daher aktualisieren sie hoffentlich ihren Index an Ihrem neuen Standort. –

+0

@James Es ist das "Hoffnungsvolle", das sie dazu bringt, die Einschränkungen zu setzen und den Grund, warum ich nach einem anderen Weg frage. –

Verwandte Themen