截断查询字符串并返回干净的 URL C# ASP.net
Posted
技术标签:
【中文标题】截断查询字符串并返回干净的 URL C# ASP.net【英文标题】:Truncating Query String & Returning Clean URL C# ASP.net 【发布时间】:2010-11-14 08:34:57 【问题描述】:我想获取原始 URL,截断查询字符串参数,并返回 URL 的清理版本。我希望它发生在整个应用程序中,因此通过 global.asax 执行将是理想的。另外,我认为 301 重定向也可以。
即。
在:www.website.com/default.aspx?utm_source=twitter&utm_medium=social-media
输出:www.website.com/default.aspx
实现这一目标的最佳方法是什么?
【问题讨论】:
【参考方案1】: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) 来重定向调用者。
希望有帮助
【讨论】:
这是我们最终想出的: //begin 格式不佳的字符串 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 规范 = 新 HtmlLink(); canonical.Href = rawUrl; canonical.Attributes["rel"] = "canonical"; Page.Header.Controls.Add(canonical);后跟一个正确获取应用程序 URL 的函数。完美运行。 @Rob Levine:Uri.GetLeftPart
实际上会得到包含(即向上)指定部分的URL的左边部分。如果它只达到指定的部分,它会在你想要的整个部分附近停止。
@Suncat2000 - 现在在上面的文字中澄清了 - 谢谢【参考方案2】:
这是获取根路径的快速方法,无需完整路径和查询。
string path = Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery,"");
【讨论】:
这也将删除路径,而不仅仅是查询字符串【参考方案3】:在完成对查询字符串需要做的任何处理后,只需在问号上拆分url:
Dim _CleanUrl as String = Request.Url.AbsoluteUri.Split("?")(0)
Response.Redirect(_CleanUrl)
当然,我的解决方案是在 VB.NET 中,但我想它可以很容易地移植过来。而且由于我们只寻找拆分的第一个元素,因此当没有查询字符串时,它甚至会优雅地“失败”。
【讨论】:
【参考方案4】:这是一个简单的技巧
Dim uri = New Uri(Request.Url.AbsoluteUri)
dim reqURL = uri.GetLeftPart(UriPartial.Path)
【讨论】:
【参考方案5】:看看 UriBuilder 类。您可以使用 url 字符串创建一个,然后该对象将解析此 url 并让您仅访问所需的元素。
【讨论】:
【参考方案6】:这看起来会好一些。
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 的函数。
完美运行。
【讨论】:
不应该是 bool hasQueryStrings = Request.QueryString.Keys.Count > 0;【参考方案7】:我猜您想要这样做是因为您希望您的用户看到漂亮的 URL。让客户端“更改”其地址栏中的 URL 的唯一方法是将其发送到新位置 - 即您需要重定向它们。
查询字符串参数会影响页面的输出吗?如果是这样,您将不得不查看如何维护请求之间的状态(会话变量、cookie 等),因为一旦您重定向到没有它们的页面,您的查询字符串参数就会丢失。
您可以通过以下几种方式在全局范围内执行此操作(按优先顺序):
如果您可以直接控制服务器环境,那么像 ISAPI_ReWrite 或 IIS 7.0 URL Rewrite Module 这样的可配置服务器模块是一个很好的方法。 自定义IHttpModule
是一种不错的、可重复使用的自行滚动方法。
您也可以按照您的建议在global.asax
中执行此操作
如果资源确实已永久移动,您应该只使用301
响应代码。同样,这取决于您的应用程序是否需要使用查询字符串参数。如果您使用永久重定向,浏览器(尊重301
响应代码)将跳过加载像 .../default.aspx?utm_source=twitter&utm_medium=social-media 这样的 URL 并加载 .../default.aspx - 你永远不会知道查询字符串参数。
最后,您可以使用POST
方法请求。这为您提供了干净的 URL 并允许您传入参数,但仅适用于 <form>
元素或您使用 javascript 创建的请求。
【讨论】:
如果你想让用户看到漂亮的 url,为什么不直接使用 URL Mapping? URL 映射可能有效,但您需要为 web.config 文件中的每个页面定义一个映射。您无法定义一般规则。不过,如果站点中的页面不多,那么配置一次可能会很好。另一方面,URL 重写为您提供了更多控制权。 他这样做是为了添加规范链接并巩固页面排名,而不是用于 url 重写目的:googlewebmastercentral.blogspot.com/2009/02/…以上是关于截断查询字符串并返回干净的 URL C# ASP.net的主要内容,如果未能解决你的问题,请参考以下文章
带有“返回记录:否”的 MS Access 直通查询截断 ODBC 连接字符串