2008-08-27 9 views
27

Ich habe eine Methode, wo ich den Benutzer zurück zu einer Anmeldeseite im Stamm meiner Webanwendung umleiten möchte.Response.Redirect using ~ Pfad

Ich verwende den folgenden Code:

Response.Redirect("~/Login.aspx?ReturnPath=" + Request.Url.ToString()); 

Dies allerdings nicht funktioniert. Meine Annahme war, dass ASP.NET die URL automatisch in den richtigen Pfad auflöst. Normalerweise würde ich einfach

verwenden, aber dieser Code befindet sich auf einer Masterseite und kann von jeder Ordnerebene ausgeführt werden. Wie komme ich zu diesem Problem?

Antwort

64

Ich glaube, Sie müssen die "~ /" fallen zu lassen und ersetzen Sie es mit nur "/", glaube ich,/ist die Wurzel

STOPP GENAU DA! :-) Es sei denn, Sie möchten Ihre Web-App so programmieren, dass sie nur im Stammverzeichnis einer Website installiert werden kann.

„~ /“ ist die richtige Sache zu verwenden, aber der Grund, dass Ihre ursprüngliche Code funktioniert nicht wie erwartet, dass ResolveUrl (die von Redirect intern verwendet wird) versucht zunächst, zu arbeiten, wenn die Pfad, den Sie übergeben, ist eine absolute URL (zB "** http://server/ ** foo/bar.htm" im Gegensatz zu "foo/bar.htm") - aber leider tut es dies, indem Sie einfach nach einem Doppelpunkt suchen ':' in der URL gibst du es. Aber in diesem Fall findet es einen Doppelpunkt in der URL, die Sie in dem ReturnPath Query-String-Wert angeben, der es täuscht - daher wird Ihr '~ /' nicht aufgelöst.

Der Fix ist, dass Sie URL-Codierung der ReturnPath Wert sein sollte, die die problematische ":" zusammen mit anderen Sonderzeichen entkommt.

Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.ToString())); 

Außerdem empfehle ich, dass Sie (oder jemand) nie Uri.ToString verwenden - weil sie eine menschenlesbare gibt, mehr „freundliche“ Version der URL - nicht unbedingt richtig ein (es demaskiert Dinge). Stattdessen Uri.AbsoluteUri verwenden - etwa so:

Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.AbsoluteUri)); 
-3

Was ist mit

Response.Redirect(String.Format("http://{0}/Login.aspx?ReturnPath={1}", Request.ServerVariables["SERVER_NAME"], Request.Url.ToString())); 
+1

Mit dem Servername problematisch ist, wie es ist wahrscheinlich, dass die Website eine benutzerdefinierte DNS nutzen könnte. Wenn das Protokoll als "http" fest codiert wäre, würden auch Probleme bei Websites auftreten, die HTTPS verwenden. –