【问题标题】:Truncating Query String & Returning Clean URL C# ASP.net截断查询字符串并返回干净的 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

实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: c# asp.net url query-string truncate


    【解决方案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_ReWriteIIS 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/…
          猜你喜欢
          • 1970-01-01
          • 2012-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-12
          • 1970-01-01
          相关资源
          最近更新 更多