截断查询字符串&返回干净的URL C#ASP.net

时间:2009-07-27 13:12:51

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

我想获取原始网址,截断查询字符串参数,并返回已清理的网址版本。我希望它在整个应用程序中发生,因此通过global.asax执行将是理想的。此外,我认为301重定向也是有序的。

位于:www.website.com/default.aspx?utm_source=twitter&utm_medium=social-media

out:www.website.com/default.aspx

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

7 个答案:

答案 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等)之间维护状态,因为一旦你重定向到没有它们的页面,你的查询字符串参数就会丢失。

有几种方法可以全局(按优先顺序):

  • 如果您可以直接控制服务器环境,那么可以使用ISAPI_ReWriteIIS 7.0 URL Rewrite Module这样的可配置服务器模块。
  • 自定义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中,但我想它可以非常轻松地移植。因为我们只是在寻找分裂的第一个元素,所以当没有查询字符串时它甚至会“优雅地”失败。