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

zzwlnbp8  于 2022-12-27  发布在  .NET
关注(0)|答案(7)|浏览(146)

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

网址:www.website.com/default.aspx?utm_source=twitter&utm_medium=social-media
输出:www.website.com/default.aspx
实现这一目标的最佳途径是什么?

hujrc8aj

hujrc8aj1#

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
[The URI类需要指定协议http://]
GetLeftPart的基本意思是“获取uri * 的左边部分,包括我指定的部分”,它可以是Scheme(只有http://位)、Authority(www.website.com部分)、Path(/default.aspx)或Query(查询字符串)。
假设您位于aspx网页上,则可以使用Response.Redirect(newUrl)重定向调用方。

cetgtptt

cetgtptt2#

这里有一个简单的技巧

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

dim reqURL = uri.GetLeftPart(UriPartial.Path)
pcrecxhr

pcrecxhr3#

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

string path = Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery,"");
j2cgzkjk

j2cgzkjk4#

这个看起来可能会好一点。

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。
完美的工作。

gr8qqesn

gr8qqesn5#

我猜你想这么做是因为你想让你的用户看到漂亮的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创建的请求。

l5tcr1uw

l5tcr1uw6#

看看UriBuilder类,你可以用url字符串创建一个,然后这个对象会解析这个url,让你只访问你想要的元素。

htzpubme

htzpubme7#

在完成了对查询字符串所需的任何处理之后,只需在问号处拆分URL即可:

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

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

相关问题