截断查询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的时候它甚至会“优雅地失败”。