55

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

IE。

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

出:www.website.com/default.aspx

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

4

7 回答 7

121

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) 来重定向调用者。

希望有帮助

于 2009-07-27T13:33:33.740 回答
8

这是一个简单的技巧

Dim uri = New Uri(Request.Url.AbsoluteUri)

dim reqURL = uri.GetLeftPart(UriPartial.Path)
于 2012-01-10T16:29:22.150 回答
2

这是获取根路径的快速方法,无需完整路径和查询。

string path = Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery,"");
于 2014-05-01T03:24:18.003 回答
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 的函数。

完美运行。

于 2009-07-28T04:18:42.780 回答
0

看看 UriBuilder 类。您可以使用 url 字符串创建一个,然后该对象将解析此 url 并让您仅访问所需的元素。

于 2009-07-27T13:17:56.490 回答
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的 URL并加载.../default.aspx - 你永远不会甚至知道查询字符串参数。

最后,您可以使用POST方法请求。这为您提供了干净的 URL 并允许您传入参数,但仅适用于<form>您使用 JavaScript 创建的元素或请求。

于 2009-07-27T13:35:32.863 回答
-3

在完成您需要对查询字符串执行的任何处理后,只需在问号上拆分 url:

Dim _CleanUrl as String = Request.Url.AbsoluteUri.Split("?")(0)
Response.Redirect(_CleanUrl)

当然,我的解决方案是在 VB.NET 中,但我想它可以很容易地移植。而且由于我们只寻找拆分的第一个元素,因此当没有查询字符串时,它甚至会优雅地“失败”。

于 2011-12-27T22:05:23.180 回答