WedX - журнал о программировании и компьютерных науках

Усечение строки запроса и возврат чистого URL C# ASP.net

Я хотел бы взять исходный URL-адрес, обрезать параметры строки запроса и вернуть очищенную версию URL-адреса. Я бы хотел, чтобы это происходило во всем приложении, поэтому выполнение через global.asax было бы идеальным. Кроме того, я думаю, что редирект 301 также будет уместен.

ie.

в: www.website.com/default.aspx?utm_source=twitter&utm_medium=social-media

выход: www.website.com/default.aspx

Каков наилучший способ добиться этого?


Ответы:


1

System.Uri — ваш друг. Здесь есть много полезных утилит, но вам нужна GetLeftPart:

 string url = "https://www.website.com/default.aspx?utm_source=twitter&utm_medium=social-media";
 Uri uri = new Uri(url);
 Console.WriteLine(uri.GetLeftPart(UriPartial.Path));

Это дает результат: https://www.website.com/default.aspx

[Класс Uri требует указания протокола https://]

GetLeftPart в основном говорит, что нужно получить левую часть uri вплоть до той части, которую я укажу. Это может быть схема (только бит https://), авторитет (часть www.website.com) , Путь (/default.aspx) или Запрос (строка запроса).

Предполагая, что вы находитесь на веб-странице aspx, вы можете использовать Response.Redirect(newUrl) для перенаправления вызывающего абонента.

надеюсь, это поможет

27.07.2009
  • Вот что мы наконец придумали: //начнем плохое форматирование строки rawUrl = String.Concat(this.GetApplicationUrl(), Request.RawUrl); if (rawUrl.Contains(/post/)) { bool hasQueryStrings = Request.QueryString.Keys.Count › 1; if (hasQueryStrings) { Uri uri = новый Uri (rawUrl); rawUrl = uri.GetLeftPart(UriPartial.Path); Канонический HtmlLink = новый HtmlLink(); канонический.Href = rawUrl; canonical.Attributes[rel] = canonical; Page.Header.Controls.Add(канонический); } } Затем следует функция для правильного получения URL-адреса приложения. Работает отлично. 28.07.2009
  • @Rob Levine: Uri.GetLeftPart на самом деле получит левый часть URL-адреса, содержащая (т.е. вверх по) указанную часть. Если бы он дошел только до до указанной части, он бы остановился почти до всей части, которую вы хотели. 18.03.2021
  • @ Suncat2000 - теперь пояснено в тексте выше - спасибо 19.03.2021

  • 2

    Вот простой трюк

    Dim uri = New Uri(Request.Url.AbsoluteUri)
    
    dim reqURL = uri.GetLeftPart(UriPartial.Path)
    
    10.01.2012

    3

    Вот быстрый способ получить корневой путь без полного пути и запроса.

    string path = Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery,"");
    
    01.05.2014
  • Это также удалит путь, а не только строку запроса. 10.05.2017

  • 4

    Это может выглядеть немного лучше.

        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-адреса приложения.

    Работает отлично.

    28.07.2009
  • разве это не должно быть bool hasQueryStrings = Request.QueryString.Keys.Count › 0; 07.09.2011

  • 5

    Я предполагаю, что вы хотите сделать это, потому что хотите, чтобы ваши пользователи видели красивые URL-адреса. Единственный способ заставить клиента «изменить» URL-адрес в адресной строке — отправить его в новое место, т. е. вам нужно перенаправить их.

    Будут ли параметры строки запроса влиять на вывод вашей страницы? Если это так, вам придется посмотреть, как поддерживать состояние между запросами (переменные сеанса, файлы cookie и т. д.), потому что ваши параметры строки запроса будут потеряны, как только вы перенаправите на страницу без них.

    Есть несколько способов сделать это глобально (в порядке предпочтения):

    • Если у вас есть прямой контроль над серверной средой, то настраиваемый серверный модуль, такой как ISAPI_ReWrite или Модуль перезаписи URL-адресов IIS 7.0 — отличный подход.
    • Пользовательский IHttpModule – это удобная, многократно свой собственный подход.
    • Вы также можете сделать это в global.asax, как вы предлагаете

    Код ответа 301 следует использовать только в том случае, если ресурс действительно перемещен навсегда. Опять же, это зависит от того, нужно ли вашему приложению использовать параметры строки запроса. Если вы используете постоянное перенаправление, браузер (который учитывает код ответа 301) пропустит загрузку URL-адреса, такого как .../default.aspx?utm_source=twitter&utm_medium=social-media, и загрузит . ../default.aspx — вы даже не узнаете о параметрах строки запроса.

    Наконец, вы можете использовать запросы метода POST. Это дает вам чистые URL-адреса и позволяет передавать параметры, но будет работать только с <form> элементами или запросами, которые вы создаете с помощью JavaScript.

    27.07.2009
  • Если вы хотите, чтобы пользователи видели красивые URL-адреса, почему бы просто не использовать сопоставление URL-адресов? 27.07.2009
  • Сопоставление URL-адресов может работать, но вам необходимо определить сопоставление для каждой страницы в вашем файле web.config. Вы не можете определить общие правила. Тем не менее, если на сайте не так много страниц, их настройка один раз может сработать. С другой стороны, перезапись URL-адресов дает вам больше контроля. 27.07.2009
  • Он делает это для добавления канонических ссылок и повышения рейтинга страницы, а не для перезаписи URL:googlewebmastercentral.blogspot.com/2009/02/ 21.04.2011

  • 6

    Взгляните на класс UriBuilder. Вы можете создать его со строкой URL-адреса, а затем объект проанализирует этот URL-адрес и позволит вам получить доступ только к тем элементам, которые вы хотите.

    27.07.2009

    7

    После завершения любой обработки, которую вам нужно выполнить в строке запроса, просто разделите URL-адрес на вопросительный знак:

    Dim _CleanUrl as String = Request.Url.AbsoluteUri.Split("?")(0)
    Response.Redirect(_CleanUrl)
    

    Конечно, мое решение находится в VB.NET, но я полагаю, что его можно было бы довольно легко портировать. И поскольку мы ищем только первый элемент разбиения, он изящно "не работает" даже при отсутствии строки запроса.

    27.12.2011
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]