Ответ.Перенаправление с использованием ~ Path
-
09-06-2019 - |
Вопрос
У меня есть метод, при котором я хочу перенаправить пользователя обратно на страницу входа в систему, расположенную в корневом каталоге моего веб-приложения.
Я использую следующий код:
Response.Redirect("~/Login.aspx?ReturnPath=" + Request.Url.ToString());
Однако это не сработает.Я предполагал, что ASP.NET автоматически преобразует URL-адрес в правильный путь.Обычно я бы просто использовал
Response.Redirect("../Login.aspx?ReturnPath=" + Request.Url.ToString());
но этот код находится на главной странице и может быть выполнен с любого уровня папки.Как мне обойти эту проблему?
Решение
Я думаю, вам нужно удалить "~ /" и заменить его просто "/", я считаю, что / - это корень
ОСТАНОВИСЬ ПРЯМО СЕЙЧАС! :-) если только вы не хотите жестко закодировать свое веб-приложение, чтобы его можно было устанавливать только в корневом каталоге веб-сайта.
"~/" является правильная вещь для использования, но причина, по которой ваш исходный код работал не так, как ожидалось, заключается в том, что 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));
Другие советы
сначала вы можете разрешить URL-адрес Ответ.Перенаправление("~/Login.aspx);и добавьте параметры после того, как проблема будет решена.
Как насчет использования
Response.Redirect(String.Format("http://{0}/Login.aspx?ReturnPath={1}", Request.ServerVariables["SERVER_NAME"], Request.Url.ToString()));