web-dev-qa-db-fra.com

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

Je voudrais prendre l'URL d'origine, tronquer les paramètres de la chaîne de requête et renvoyer une version nettoyée de l'URL. Je souhaiterais que cela se produise dans l'ensemble de l'application, donc la performance via global.asax serait idéale. De plus, je pense qu'une redirection 301 serait également de mise.

c'est à dire.

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

sur: www.website.com/default.aspx

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

51
Chris

System.Uri est votre ami ici. Cela contient de nombreux utilitaires utiles, 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));

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

[La classe Uri nécessite que le protocole, http: //, soit spécifié]

GetLeftPart fondamentalement dit "obtenir la partie gauche de l'uri jusqu'à la partie que je spécifie". Cela peut être Scheme (juste le http: // bit), Authority (la partie www.website.com), Path (le /default.aspx) ou Query (la chaîne de requête).

En supposant que vous vous trouvez sur une page Web aspx, vous pouvez ensuite utiliser Response.Redirect (newUrl) pour rediriger l'appelant.

J'espère que cela pourra aider

110
Rob Levine

Voici une astuce simple

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

dim reqURL = uri.GetLeftPart(UriPartial.Path)
6
Farooq Kaiser

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
calmcajun

Cela peut sembler 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.

Marche parfaitement.

1
Chris

Jetez un œil à la classe UriBuilder. Vous pouvez en créer une avec une chaîne d'URL, et l'objet analysera ensuite cette URL et vous permettra d'accéder uniquement aux éléments souhaités.

0
DanDan

Je suppose que vous voulez le faire parce que vous voulez que vos utilisateurs voient des URL assez belles. La seule façon d'amener le client à "modifier" l'URL dans sa barre d'adresse est de l'envoyer vers 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 voir comment maintenir l'état entre les demandes (variables de session, cookies, etc.) car vos paramètres de chaîne de requête seront perdus dès que vous redirigerez vers une page sans eux.

Il existe plusieurs façons de le faire à l'échelle mondiale (par ordre de préférence):

  • Si vous avez un contrôle direct sur votre environnement de serveur, un module de serveur configurable comme ISAPI_ReWrite ou IIS 7.0 URL Rewrite Module est une excellente approche.
  • Un --- IHttpModule personnalisé est une approche roll-your-own agréable et réutilisable.
  • Vous pouvez également le faire dans le global.asax comme vous le suggérez

Vous ne devez utiliser que le 301 code de réponse si la ressource s'est effectivement déplacée définitivement. Encore une fois, cela dépend si votre application doit utiliser les paramètres de chaîne de requête. Si vous utilisez une redirection permanente d'un navigateur (qui respecte le 301 code de réponse) sautera le chargement d'une URL comme .../default.aspx? utm_source = Twitter & utm_medium = réseaux sociaux et chargera .../default.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 URL propres et vous permet de passer des paramètres, mais ne fonctionnera qu'avec <form> éléments ou demandes que vous créez à l'aide de JavaScript.

0
dariom