Обрезка строки запроса и возврат чистого URL в C# ASP.NET
Я хочу взять оригинальный URL, обрезать параметры строк запроса и вернуть очищенную версию URL. Это должно происходить на протяжении всего приложения, поэтому было бы идеально реализовать это через глобальный файл Global.asax
. Я также думаю, что целесообразно использовать редирект 301.
Например:
Входной URL: www.website.com/default.aspx?utm_source=twitter&utm_medium=social-media
Выходной URL: www.website.com/default.aspx
Как лучше всего достичь этой цели?
5 ответ(ов)
System.Uri — ваш лучший друг в данной ситуации. Этот класс предоставляет множество полезных функций, но в вашем случае вам нужен метод GetLeftPart:
string url = "http://www.website.com/default.aspx?utm_source=twitter&utm_medium=social-media";
Uri uri = new Uri(url);
Console.WriteLine(uri.GetLeftPart(UriPartial.Path));
Данный код выведет: http://www.website.com/default.aspx
.
[Класс Uri требует, чтобы протокол, например http://, был указан.]
Метод GetLeftPart по сути говорит: "верни левую часть URI вплоть до и включая ту часть, которую я укажу". Это может быть Scheme (только часть http://), Authority (http://www.website.com), Path (/default.aspx) или Query (строка запроса).
Если вы находитесь на странице aspx, вы можете затем использовать Response.Redirect(newUrl)
, чтобы перенаправить пользователя.
Вот простой трюк:
Dim uri = New Uri(Request.Url.AbsoluteUri)
Dim reqURL = uri.GetLeftPart(UriPartial.Path)
Этот код создает объект URI из текущего URL запроса и затем извлекает его левую часть, включая путь. Это полезно, если вам нужно получить базовый URL без параметров и якорей.
Вот быстрый способ получить корневой путь без полного пути и параметров запроса:
string path = Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery, "");
Этот код использует метод Replace
для удаления пути и параметров запроса из полного URL, оставляя только корневой путь.
Ваш код выглядит довольно неплохо. Вот как его можно перевести на русский в стиле ответа на StackOverflow:
Ваше решение выглядит вполне уместным.
string rawUrl = String.Concat(this.GetApplicationUrl(), Request.RawUrl);
if (rawUrl.Contains("/post/"))
{
bool hasQueryStrings = Request.QueryString.Keys.Count > 1;
if (hasQueryStrings)
{
Uri uri = new Uri(rawUrl);
rawUrl = uri.GetLeftPart(UriPartial.Path);
HtmlLink canonical = new HtmlLink();
canonical.Href = rawUrl;
canonical.Attributes["rel"] = "canonical";
Page.Header.Controls.Add(canonical);
}
}
В дополнение к этому, возможно, вам потребуется функция для корректного получения URL вашего приложения. Это решение должно работать без проблем.
Если у вас возникли дополнительные вопросы или нужно разъяснение по какому-то аспекту, не стесняйтесь спрашивать!
Посмотрите на класс UriBuilder. Вы можете создать его, передав строку URL, и этот объект затем разберет URL, позволяя вам получить доступ только к тем элементам, которые вам нужны.
Если папка не существует, создайте её
Запрос прерван: Не удалось создать безопасный канал SSL/TLS
Таймаут при использовании Linq-to-SQL
Как запустить модульные тесты на платформе x64?
В чем разница между двумя подходами маршрутизации на основе атрибутов: HttpGet("") и Route("")?