2008-08-27 3 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

Я думаю, что нужно опускать "~ /" и заменить его просто "/", я считаю/это корень

СТОП ПРЯМО ТАМ! :-), если вы не хотите жестко настроить свое веб-приложение, чтобы его можно было установить только в корневом каталоге веб-сайта.

«~ /» является нужная вещь для использования, но причина того, что ваш исходный код не работает, как ожидалось, что ResolveUrl (который используется внутри Redirect) пытается первым работать, если путь, который вы передаете, является абсолютным URL-адресом (например, «** http://server/ ** foo/bar.htm» в отличие от «foo/bar.htm»), но, к сожалению, он делает это, просто ищет символ двоеточия: в URL, который вы ему даете. Но в этом случае он находит двоеточие в URL-адресе, указанном в строке строки запроса ReturnPath, что его обманывает, поэтому ваш `~/'не будет разрешен.

Исправление состоит в том, что вы должны быть URL-кодированием значения ReturnPath, которое ускользает от проблемного: вместе с любыми другими специальными символами.

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. Наличие протокола hardcoded как «http» также вызовет проблемы для сайтов с использованием https. – 2016-06-07 19:15:04

 Смежные вопросы

  • Нет связанных вопросов^_^