截断查询string&返回干净的URL C#ASP.net

我想采取原始URL,截断查询string参数,并返回一个清理的URL版本。 我希望在整个应用程序中发生,所以通过global.asax执行将是理想的。 另外,我认为301redirect也是如此。

即。

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

out:www.website.com/default.aspx

什么是实现这个目标的最好方法?

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的左边部分我指定的部分”。 这可以是Scheme(只是http://位),Authority(www.website.com部分),Path(/default.aspx)或Query(查询string)。

假设你在一个aspx网页,你可以使用Response.Redirect(newUrl)redirect调用者。

希望有所帮助

这是一个简单的伎俩

 Dim uri = New Uri(Request.Url.AbsoluteUri) dim reqURL = uri.GetLeftPart(UriPartial.Path) 

这可能看起来好一点。

  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。

完美的作品。

这里是获取根pathsans完整path和查询的一种快速方法。

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

我猜你想要这样做,因为你希望你的用户看到漂亮的URL。 让客户在地址栏中“更改”URL的唯一方法是将其发送到一个新的位置 – 即您需要redirect它们。

查询string参数是否会影响页面的输出? 如果是这样,你将不得不看看如何维护请求(会话variables,cookies等)之间的状态,因为你的查询string参数将会丢失,只要你redirect到一个没有他们的页面。

有几种方法可以在全球范围内进行(按优先顺序排列):

  • 如果你直接控制你的服务器环境,那么像ISAPI_ReWrite或IIS7.0 URL重写模块这样的可configuration的服务器模块是一个很好的方法。
  • 自定义的IHttpModule是一个很好的,可重用的滚动你自己的方法。
  • 你也可以按照你的build议在global.asax做这个

如果资源确实永久移动,则只应使用301响应代码。 同样,这取决于您的应用程序是否需要使用查询string参数。 如果您使用永久redirect浏览器(即301响应代码)将跳过加载一个URL,如… / default.aspx?utm_source = twitter&utm_medium =社交媒体和加载… / default.aspx – 你会甚至不知道查询string参数。

最后,您可以使用POST方法请求。 这给你干净的URL,并允许你传入参数,但只能使用JavaScript创build的<form>元素或请求。

看看UriBuilder类。 您可以使用urlstring创build一个,然后该对象将parsing此url并让您访问您所需的元素。

在完成对查询string所做的任何处理之后,只需将问题分割为:

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

当然,我的解决scheme是在VB.NET中,但我可以想象,它可以很容易地移植。 由于我们只是在寻找分裂的第一个元素,所以当没有查询string的时候它甚至会“优雅地失败”。