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?
7 réponses
.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
voici un truc simple
Dim uri = New Uri(Request.Url.AbsoluteUri)
dim reqURL = uri.GetLeftPart(UriPartial.Path)
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.
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,"");
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.
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.
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.