55

元の URL を取得し、クエリ文字列パラメーターを切り捨てて、クリーンアップされたバージョンの URL を返したいと思います。アプリケーション全体で発生させたいので、global.asax を介して実行するのが理想的です。また、301リダイレクトも適切だと思います。

すなわち。

: 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 Web ページを使用していると仮定すると、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 に答える
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 を「変更」させる唯一の方法は、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 に答える