2008-08-27 10 views
27

나는 웹 페이지의 루트에있는 로그인 페이지로 사용자를 다시 보내고 싶습니다.Response.Redirect using ~ Path를 사용하여

나는 다음과 같은 코드를 사용하고 있습니다 :

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

이 그래도 작동하지 않습니다. 내 가정 ASP.NET은 자동으로 올바른 경로로 URL을 해결할 것입니다. 일반적으로, 난 그냥

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

을 사용하지만이 코드는 마스터 페이지에, 임의의 폴더 수준에서 실행할 수 있습니다. 이 문제를 어떻게 해결할 수 있습니까?

답변

64

사용에 대한 난 당신이 "~ /"을 삭제하고 "/"단지로 교체 할 필요가 있다고 생각, 나는 루트를/

STOP을 믿습니다 바로 거기! :-) 웹 응용 프로그램을 하드 코드하여 웹 사이트의 루트에만 설치할 수있는 경우가 아니면

"~는 /" 사용할 올바른 일이지만 예상대로 원래의 코드가 작동하지 않은 이유는 (Redirect 내부적으로 사용) ResolveUrl이 경우 첫 번째 해결하려고한다는 것입니다 경로는 절대 URL입니다 (예 : "** http://server/ ** foo/bar.htm"과 반대로 "foo/bar.htm"). 그러나 유감스럽게도 콜론 문자 ':'를 찾는 것으로이 작업을 수행합니다. 당신이 그것을주는 URL에. 하지만이 경우에는 ReturnPath 쿼리 문자열 값에있는 URL에 콜론이 있으므로 바보가되어 '~ /'가 해결되지 않습니다.

해결 방법은 다른 특수 문자와 함께 문제가있는 ':'을 이스케이프 처리하는 ReturnPath 값을 URL 인코딩해야한다는 것입니다.

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

또한, 나는 당신이 (또는 사람) Uri.ToString를 사용하지 않을 것을 권장합니다 -이 아니라 반드시 올바른 (이 일을 언 이스케이프) -는 URL의 사람이 읽을 수있는, 더 "친숙한"버전을 제공하기 때문이다. 대신 Uri.AbsoluteUri를 사용하십시오 :

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

무엇

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

사이트에서 사용자 지정 DNS를 사용할 수 있으므로 서버 이름을 사용하는 것이 문제가 될 수 있습니다. 프로토콜을 "http"로 하드 코딩하면 https를 사용하는 사이트에 문제가 발생할 수도 있습니다. –