Tronquer la chaîne de requête et renvoyer L'URL propre C# ASP.net

je voudrais prendre L'URL d'origine, tronquer les paramètres de la chaîne de requête, et retourner une version nettoyée de l'URL. Je voudrais qu'il se produise à travers l'ensemble de l'application, donc la performance à travers le global.asax serait l'idéal. Aussi, je pense qu'une redirection 301 serait dans l'ordre.

ie.

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

terminé: www.website.com/default.aspx

quelle serait la meilleure façon d'y parvenir?

49
demandé sur Chris 2009-07-27 17:12:51

7 réponses

Système

.Uri est ton amie ici. Il y a de nombreux utilitaires utiles dessus, mais celui que vous voulez est 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));

donne la sortie: http://www.website.com/default.aspx

[La classe Uri exige le protocole, http:// préciser],

GetLeftPart basicallys dit "obtenir la partie gauche de l'uri jusqu'à la partie que j'ai préciser". Cela peut être Le système (juste le http: / / bit), L'autorité (le www.website.com part), Path (The /default.aspx) ou de la Requête (la requête).

en supposant que vous êtes sur une page Web aspx, vous pouvez alors utiliser Response.Rediriger (newUrl) pour rediriger l'appelant.

L'espoir qui aide

103
répondu Rob Levine 2009-07-27 13:33:33

voici un truc simple

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

dim reqURL = uri.GetLeftPart(UriPartial.Path)
6
répondu Farooq Kaiser 2012-06-12 16:57:42

c'est peut-être un peu mieux.

    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);
        }
    }

suivi d'une fonction pour récupérer correctement L'URL de l'application.

fonctionne parfaitement.

1
répondu Chris 2009-07-28 04:18:42

voici un moyen rapide d'obtenir le chemin racine sans le chemin complet et la requête.

string path = Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery,"");
1
répondu calmcajun 2014-05-01 03:24:18

je suppose que vous voulez le faire parce que vous voulez que vos utilisateurs voient de jolies URLs. La seule façon d'amener le client à "changer" l'URL dans sa barre d'adresse est de l'Envoyer à un nouvel emplacement - c'est-à-dire que vous devez les rediriger.

les paramètres de la chaîne de requête vont-ils affecter la sortie de votre page? Si c'est le cas, vous devrez regarder comment maintenir l'état entre les requêtes (variables de session, cookies, etc.) parce que vos paramètres de chaîne de requête sera perdu dès que vous rediriger vers une page sans eux.

il y a plusieurs façons de faire cela à l'échelle mondiale (par ordre de préférence):

  • si vous avez le contrôle direct sur l'environnement de votre serveur, alors un module de serveur configurable comme ISAPI_ReWrite ou IIS 7.0 Module de réécriture D'URL est une excellente approche.
  • personnalisé IHttpModule est une belle, réutilisable à rouler propre approche.
  • vous pouvez aussi le faire dans le global.asax comme vous le suggérez

vous ne devez utiliser le code de réponse 301 que si la ressource a effectivement déménagé de façon permanente. Encore une fois, cela dépend si votre application doit utiliser les paramètres de la chaîne de requête. Si vous utilisez une redirection permanente un navigateur (qui respecte le code de réponse 301 ) sautera le chargement D'une URL comme .../défaut.aspx?utm_source=twitter&utm_medium=médias sociaux et de la charge .../défaut.aspx - vous ne connaîtrez jamais les paramètres de la chaîne de requête.

enfin, vous pouvez utiliser les requêtes de méthode POST . Cela vous donne des URLs propres et vous permet de passer des paramètres, mais ne fonctionnera qu'avec les éléments <form> ou les requêtes que vous créez en utilisant JavaScript.

0
répondu dariom 2009-07-27 13:35:32

regardez la classe UriBuilder. Vous pouvez en créer un avec une chaîne d'url, et l'objet analysera alors cette url et vous laissera accéder seulement aux éléments que vous désirez.

0
répondu DanDan 2009-07-29 08:51:13

après avoir terminé tout le traitement que vous devez faire sur la chaîne de requête, il suffit de diviser l'url sur le point d'interrogation:

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

D'accord, ma solution est dans VB.NET mais j'imagine qu'il pourrait être porté assez facilement. Et puisque nous ne cherchons que le premier élément de la scission, il "échoue" même avec élégance quand il n'y a pas de querystring.

-3
répondu Michael Church 2012-11-03 08:14:58