Frage

Ich wanderte vor kurzem eine Website auf ein neues CMS (Umbraco). Viele der Links haben sich geändert, aber sie können leicht durch die Suche nach prasselt in der URL korrigiert werden, so würde Ich mag, etwas zu schreiben, die auf die richtige Seite umleiten, wenn das alte nicht gefunden wird. Dieser Teil ist das kein Problem.

Wie kann ich die angeforderte URL erhalten, nachdem der Browser auf meine benutzerdefinierten 404-Seite umgeleitet wird. Ich habe versucht, mit:

request.ServerVariables("HTTP_REFERER") 'sorry i corrected the typo from system to server.

Aber das hat nicht funktioniert.

Irgendwelche Ideen?

Die Seite ist auf IIS 6.0. Wir betrachten haben 301 Umleitungen verwenden, aber wir haben keine Möglichkeit zu wissen, welche Seiten Menschen vorgemerkt haben, und es gibt ein paar hundert Seiten, so dass niemand ist daran interessiert, die Zeit zu verbringen, die 301 erstellen zu können.

War es hilfreich?

Lösung

ich im Grunde die gleiche Sache, die Sie in einer benutzerdefinierten 404 Fehlerbehandlung Seite fragen. Auf IIS 6 ist die ursprüngliche URL in dem Query-String. Der folgende Code zeigt, wie die Original-URL greifen und dann den Benutzer weiterzuleiten. In meinem Fall wechselte ich von den alten ASP zu neuen ASP.NET, so dass die alle ASP-Seiten mußten weitergeleitet werden Seiten .aspx. Auch einige URLs so geändert Ich suche nach Keywords in der alten URL und nach vorn.

//did the error go to a .ASP page?  If so, append x (for .aspx) and 
//issue a 301 permanently moved
//when we get an error, the querystring will be "404;<complete original URL>"
string targetPage = Request.RawUrl.Substring(Request.FilePath.Length);

if((null == targetPage) || (targetPage.Length == 0))
    targetPage = "[home page]";
else
{
     //find the original URL
    if(targetPage[0] == '?')
    {
        if(-1 != targetPage.IndexOf("?aspxerrorpath="))
             targetPage = targetPage.Substring(15); // ?aspxerrorpath=
        else
             targetPage = targetPage.Substring(5); // ?404;
        }
        else
        {
             if(-1 != targetPage.IndexOf("errorpath="))
             targetPage = targetPage.Substring(14); // aspxerrorpath=
             else
            targetPage = targetPage.Substring(4); // 404;
        }
    }               

    string upperTarget = targetPage.ToUpper();
    if((-1 == upperTarget.IndexOf(".ASPX")) && (-1 != upperTarget.IndexOf(".ASP")))
    {
        //this is a request for an .ASP page - permanently redirect to .aspx
        targetPage = upperTarget.Replace(".ASP", ".ASPX");
        //issue 301 redirect
        Response.Status = "301 Moved Permanently"; 
        Response.AddHeader("Location",targetPage);
        Response.End();
    }

    if(-1 != upperTarget.IndexOf("ORDER"))
    {
                //going to old order page -- forward to new page
               Response.Redirect(WebRoot + "/order.aspx");
           Response.End();
    }

Andere Tipps

Wie wäre:

Request.ServerVariables("HTTP_REFERER");
  

Viele der Links verändert haben, aber sie können leicht durch die Suche nach prasselt in der URL korrigiert werden

Anstatt die Benutzer senden zu einem 404 haben Sie url re-writes betrachtet verwenden? Auf diese Weise Ihre Benutzer (und Suchmaschinen, wenn das in diesem Fall für Sie wichtig ist) ein 301 erhalten oder 302 anstatt durch Ihre 404-Handler zu gehen. Es ist in der Regel schneller und weniger belastend auf den Servern die Rewrite auf URL-Ebene zu handhaben als Code Anheizen und dort verarbeitet werden.

Microsoft hat für IIS 7 URL Rewrite-Modul veröffentlicht >, und es gibt eine anständige Einführung in das hier und hier .

Für IIS 6 gibt es eine

Hier ist, was wir auf init auf unseren 404-Seiten tun:

Dim AttemptedUrl As String = Request.QueryString("aspxerrorpath")
If Len(AttemptedUrl) = 0 Then AttemptedUrl = Request.Url.Query
AttemptedUrl = LCase(AttemptedUrl)
CheckForRedirects(AttemptedUrl)

CheckforRedirects dann hat benutzerdefinierte Logik alten URLs mit neuen URLs übereinstimmen.

Ich würde argumentieren, dass dies der bevorzugte Ansatz ist (als Umschreiben zu 301s oder URL im Gegensatz), wenn Sie intern genügend Informationen haben eine große Anzahl von URLs aus dem alten System mit dem neuen System zusammenpassen - z.B. wenn Sie eine Tabelle, die alten IDs mit neuen IDs oder etwas ähnliches zusammenpasst.

Wenn es ein einheitliches Muster ist, dass Sie mit einem regulären Ausdruck, um neue URLs alte URLs auf der Karte, obwohl verwenden können, dann wäre URL-Rewriting der Weg zu gehen.

auf dem Rewrites Vorschlag zu erstellen, Umbraco bereits verwendet UrlRewriting.NET und neue Schreibungen können hinzugefügt werden

\config\UrlRewriting.config

Hope, das hilft

Update, wollen Sie tatsächlich holen:

VB.NET:

Request.QueryString("aspxerrorpath")

C #:

Request.QueryString["aspxerrorpath"];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top