我想获取原始URL,截断查询字符串参数,并返回URL的清理版本。我希望它发生在整个应用程序中,所以通过global.asax执行将是理想的。此外,我认为301重定向也将是适当的。即网址:www.website.com/default.aspx?utm_source=twitter&utm_medium=social-media输出:www.website.com/default.aspx实现这一目标的最佳途径是什么?
hujrc8aj1#
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[The URI类需要指定协议http://]GetLeftPart的基本意思是“获取uri * 的左边部分,包括我指定的部分”,它可以是Scheme(只有http://位)、Authority(www.website.com部分)、Path(/default.aspx)或Query(查询字符串)。假设您位于aspx网页上,则可以使用Response.Redirect(newUrl)重定向调用方。
cetgtptt2#
这里有一个简单的技巧
Dim uri = New Uri(Request.Url.AbsoluteUri) dim reqURL = uri.GetLeftPart(UriPartial.Path)
pcrecxhr3#
下面是一个快速获取根路径的方法,无需完整路径和查询。
string path = Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery,"");
j2cgzkjk4#
这个看起来可能会好一点。
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。完美的工作。
gr8qqesn5#
我猜你想这么做是因为你想让你的用户看到漂亮的URL。让客户端“改变”地址栏中的URL的唯一方法是把它发送到一个新的位置--也就是说,你需要重定向它们。查询字符串参数会影响页面的输出吗?如果会,您必须考虑如何维护请求之间的状态(会话变量、cookie等),因为一旦您重定向到没有查询字符串参数的页面,查询字符串参数就会丢失。有几种方法可以全局执行此操作(按首选顺序):
IHttpModule
global.asax
只有当资源确实永久移动时,才应该使用301响应代码。这取决于您的应用程序是否需要使用查询字符串参数。如果您使用永久重定向浏览器(考虑301响应代码)将跳过加载类似于 .../default.aspx?utm_source=twitter&utm_medium=social-media 的URL,而加载 .../default.aspx -您甚至永远不会知道查询字符串参数。最后,您可以使用POST方法请求,这会提供干净的URL并允许您传入参数,但只适用于<form>元素或使用JavaScript创建的请求。
301
POST
<form>
l5tcr1uw6#
看看UriBuilder类,你可以用url字符串创建一个,然后这个对象会解析这个url,让你只访问你想要的元素。
htzpubme7#
在完成了对查询字符串所需的任何处理之后,只需在问号处拆分URL即可:
Dim _CleanUrl as String = Request.Url.AbsoluteUri.Split("?")(0) Response.Redirect(_CleanUrl)
诚然,我的解决方案是用VB.NET编写的,但我想它可以很容易地移植过来,而且由于我们只查找拆分的第一个元素,所以当没有查询字符串时,它甚至会优雅地“失败”。
7条答案
按热度按时间hujrc8aj1#
System.Uri是您在这里的朋友。它有许多有用的实用程序,但您需要的是GetLeftPart:
这给出了输出:http://www.website.com/default.aspx
[The URI类需要指定协议http://]
GetLeftPart的基本意思是“获取uri * 的左边部分,包括我指定的部分”,它可以是Scheme(只有http://位)、Authority(www.website.com部分)、Path(/default.aspx)或Query(查询字符串)。
假设您位于aspx网页上,则可以使用Response.Redirect(newUrl)重定向调用方。
cetgtptt2#
这里有一个简单的技巧
pcrecxhr3#
下面是一个快速获取根路径的方法,无需完整路径和查询。
j2cgzkjk4#
这个看起来可能会好一点。
后面跟一个函数,用于正确获取应用程序URL。
完美的工作。
gr8qqesn5#
我猜你想这么做是因为你想让你的用户看到漂亮的URL。让客户端“改变”地址栏中的URL的唯一方法是把它发送到一个新的位置--也就是说,你需要重定向它们。
查询字符串参数会影响页面的输出吗?如果会,您必须考虑如何维护请求之间的状态(会话变量、cookie等),因为一旦您重定向到没有查询字符串参数的页面,查询字符串参数就会丢失。
有几种方法可以全局执行此操作(按首选顺序):
IHttpModule
是一种很好的、可重用的、自己动手的方法。global.asax
中执行此操作只有当资源确实永久移动时,才应该使用
301
响应代码。这取决于您的应用程序是否需要使用查询字符串参数。如果您使用永久重定向浏览器(考虑301
响应代码)将跳过加载类似于 .../default.aspx?utm_source=twitter&utm_medium=social-media 的URL,而加载 .../default.aspx -您甚至永远不会知道查询字符串参数。最后,您可以使用
POST
方法请求,这会提供干净的URL并允许您传入参数,但只适用于<form>
元素或使用JavaScript创建的请求。l5tcr1uw6#
看看UriBuilder类,你可以用url字符串创建一个,然后这个对象会解析这个url,让你只访问你想要的元素。
htzpubme7#
在完成了对查询字符串所需的任何处理之后,只需在问号处拆分URL即可:
诚然,我的解决方案是用VB.NET编写的,但我想它可以很容易地移植过来,而且由于我们只查找拆分的第一个元素,所以当没有查询字符串时,它甚至会优雅地“失败”。