Response.Redirect usando ~ Ruta
-
09-06-2019 - |
Pregunta
Tengo un método en el que quiero redirigir al usuario a una página de inicio de sesión ubicada en la raíz de mi aplicación web.
Estoy usando el siguiente código:
Response.Redirect("~/Login.aspx?ReturnPath=" + Request.Url.ToString());
Aunque esto no funciona.Supuse que ASP.NET resolvería automáticamente la URL en la ruta correcta.Normalmente, solo usaría
Response.Redirect("../Login.aspx?ReturnPath=" + Request.Url.ToString());
pero este código está en una página maestra y se puede ejecutar desde cualquier nivel de carpeta.¿Cómo soluciono este problema?
Solución
Creo que necesitas eliminar "~/" y reemplazarlo solo con "/", creo que / es la raíz
¡ALTO AHÍ! :-) a menos que desee codificar su aplicación web para que solo pueda instalarse en la raíz de un sitio web.
"~/" es lo correcto a usar, pero la razón por la que su código original no funcionó como se esperaba es que ResolveUrl
(que es utilizado internamente por Redirect
) intenta averiguar primero si la ruta que está pasando es una URL absoluta (p. ej."**http://servidor/**foo/bar.htm" en lugar de "foo/bar.htm"), pero desafortunadamente lo hace simplemente buscando un carácter de dos puntos ':' en la URL que le proporciona.Pero en este caso encuentra dos puntos en la URL que proporcionas en el ReturnPath
valor de la cadena de consulta, lo que lo engaña; por lo tanto, su '~/' no se resuelve.
La solución es que debería codificar la URL del ReturnPath
valor que escapa al problemático ':' junto con cualquier otro carácter especial.
Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.ToString()));
Además, recomiendo que usted (o cualquier persona) nunca use Uri.ToString
- porque proporciona una versión más "amigable" y legible por humanos de la URL, no necesariamente correcta (no deja escapar las cosas).En su lugar, utilice Uri.AbsoluteUri, así:
Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.AbsoluteUri));
Otros consejos
puede resolver la primera respuesta de URL.Redirect ("~/Login.aspx);y agregue los parámetros después de que se haya resuelto.
¿Qué pasa con el uso
Response.Redirect(String.Format("http://{0}/Login.aspx?ReturnPath={1}", Request.ServerVariables["SERVER_NAME"], Request.Url.ToString()));