web-dev-qa-db-ja.com

クエリ文字列の切り捨てとクリーンURL C#ASP.netの返送

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

すなわち。

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

out:www.website.com/default.aspx

これを達成する最良の方法は何でしょうか?

51
Chris

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 Basicsは、「uriの左側の部分を指定した部分まで取得する」と言います。これには、Scheme(http://ビットのみ)、Authority(www.website.com部分)、Path(/default.aspx)、またはQuery(クエリ文字列)を使用できます。

Aspx Webページを使用している場合、Response.Redirect(newUrl)を使用して呼び出し元をリダイレクトできます。

役立つことを願っています

110
Rob Levine

ここに簡単なトリックがあります

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

dim reqURL = uri.GetLeftPart(UriPartial.Path)
6
Farooq Kaiser

完全なパスとクエリを使用せずにルートパスを取得する簡単な方法を次に示します。

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

これは少し良く見えるかもしれません。

    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を適切に取得する関数が続きます。

完全に動作します。

1
Chris

UriBuilderクラスを見てください。 URL文字列で作成できます。オブジェクトはこのURLを解析し、必要な要素だけにアクセスできます。

0
DanDan

ユーザーに見栄えの良いURLを見せたいので、これをやりたいと思っています。クライアントにアドレスバーのURLを「変更」させる唯一の方法は、クライアントを新しい場所に送信することです。つまり、リダイレクトする必要があります。

クエリ文字列パラメーターはページの出力に影響しますか?その場合、リクエスト(セッション変数、Cookieなど)間の状態を維持する方法を検討する必要があります。クエリ文字列パラメーターは、それらがないとページにリダイレクトするとすぐに失われるためです。

これをグローバルに(優先順に)行う方法はいくつかあります。

  • サーバー環境を直接制御できる場合は、 ISAPI_ReWrite または IIS 7.0 URL Rewrite Module などの構成可能なサーバーモジュールが優れたアプローチです。
  • カスタム IHttpModule は、ニースで再利用可能なロールユア独自のアプローチです。
  • 提案どおりglobal.asaxでこれを行うこともできます

リソースが実際に永久に移動した場合にのみ、301応答コードを使用する必要があります。繰り返しますが、これは、アプリケーションでクエリ文字列パラメーターを使用する必要があるかどうかによって異なります。パーマネントリダイレクトを使用する場合、ブラウザ(301応答コードを尊重する)は、.../default.aspx?utm_source = Twitter&utm_medium = social-mediaのようなURLの読み込みをスキップしますおよびload.../default.aspx-クエリ文字列パラメーターについても知ることはありません。

最後に、POSTメソッドリクエストを使用できます。これにより、クリーンなURLが得られ、パラメーターを渡すことができますが、<form>要素またはJavaScriptを使用して作成したリクエストでのみ機能します。

0
dariom