我想获取原始网址,截断查询字符串参数,并返回已清理的网址版本。我希望它在整个应用程序中发生,因此通过global.asax执行将是理想的。此外,我认为301重定向也是有序的。
即
位于:www.website.com/default.aspx?utm_source=twitter&utm_medium=social-media
out:www.website.com/default.aspx
实现这一目标的最佳方式是什么?
答案 0 :(得分:109)
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(查询字符串)。
假设您使用的是aspx网页,则可以使用Response.Redirect(newUrl)重定向调用者。
希望有所帮助
答案 1 :(得分:6)
这是一个简单的技巧
Dim uri = New Uri(Request.Url.AbsoluteUri)
dim reqURL = uri.GetLeftPart(UriPartial.Path)
答案 2 :(得分:1)
这看起来可能会好一些。
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的功能。
完美无缺。
答案 3 :(得分:1)
以下是获取完整路径和查询的根路径的快速方法。
string path = Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery,"");
答案 4 :(得分:0)
看看UriBuilder类。您可以使用url字符串创建一个,然后该对象将解析此URL并让您只访问所需的元素。
答案 5 :(得分:0)
我猜你想这样做,因为你希望你的用户看到漂亮的URL。让客户端“更改”地址栏中的URL的唯一方法是将其发送到新位置 - 即您需要重定向它们。
查询字符串参数是否会影响页面的输出?如果是这样,你将不得不考虑如何在请求(会话变量,cookie等)之间维护状态,因为一旦你重定向到没有它们的页面,你的查询字符串参数就会丢失。
有几种方法可以全局(按优先顺序):
IHttpModule
是一种不错的,可重复使用的滚动式方法。global.asax
执行此操作如果资源确实永久移动,您应该只使用301
响应代码。同样,这取决于您的应用程序是否需要使用查询字符串参数。如果您使用永久重定向浏览器(尊重301
响应代码)将跳过加载像 ... / default.aspx这样的网址?utm_source = twitter& utm_medium = social-media 并加载 ... / default.aspx - 您甚至不会知道查询字符串参数。
最后,您可以使用POST
方法请求。这为您提供了干净的URL,并允许您传入参数,但只能使用您使用JavaScript创建的<form>
元素或请求。
答案 6 :(得分:-3)
完成查询字符串上需要处理的任何处理后,只需在问号上拆分网址:
Dim _CleanUrl as String = Request.Url.AbsoluteUri.Split("?")(0)
Response.Redirect(_CleanUrl)
当然,我的解决方案是在VB.NET中,但我想它可以非常轻松地移植。因为我们只是在寻找分裂的第一个元素,所以当没有查询字符串时它甚至会“优雅地”失败。