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