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

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

т.

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

out: www.website.com/default.aspx

Каким будет лучший способ достичь этого?

Ответ 1

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 до той части, которую я указываю". Это может быть схема (только http://бит), полномочия (часть www.website.com), путь (/default.aspx) или запрос (запрос).

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

Надеюсь, что поможет

Ответ 2

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

Dim uri = New Uri(Request.Url.AbsoluteUri)

dim reqURL = uri.GetLeftPart(UriPartial.Path)

Ответ 3

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

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

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

Ответ 4

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

string path = Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery,"");

Ответ 5

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

Ответ 6

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

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

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

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

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

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

Ответ 7

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

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

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