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?
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
Voici une astuce simple
Dim uri = New Uri(Request.Url.AbsoluteUri)
dim reqURL = uri.GetLeftPart(UriPartial.Path)
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,"");
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.
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.
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):
IHttpModule
personnalisé est une approche roll-your-own agréable et réutilisable.global.asax
comme vous le suggérezVous 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.