截断查询字符串并返回干净的 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的主要内容,如果未能解决你的问题,请参考以下文章

c# SqlDataAdapter 不返回结果

带有“返回记录:否”的 MS Access 直通查询截断 ODBC 连接字符串

ajax 在 asp.net 中返回一个未定义的对象

ASP C#:特殊字符:#、$、+ 不能通过 URL 参数

Asp.Net Post传的字符串太长,导致收到的时候被截断!

c# 安全地截断 HTML 以获取文章摘要