11

私は数年前、単一の APSX ページを使用してすべてのサイト ページを表示するデータベース駆動の ASP.NET サイトを作成しました。したがって、サイトのすべての URL は次の形式になります。

/main.aspx?page=Page+Title+One

/main.aspx?page=Another+Article+Title

/main.aspx?page=Third+Page

main.aspx ページは、クエリ文字列データ (Page+Title+One など) を取得し、それをキーとして使用して、SQL サーバー データベースから適切な記事コンテンツを取得します。ページの実際のタイトルは、プラスの代わりにスペースを使用してデータベースに保存されます (たとえば、「ページ タイトル 1」)。

URL クエリ文字列の単語区切りとして + 記号を使用するという不適切な決定は、最近検索エンジンで多くの問題 (コンテンツの重複など) を引き起こしているため、URL を変更せずに修正したいと考えています。

私がやりたいことは、検索エンジンまたは訪問者が間違った URL にアクセスしようとしたときに + 記号がなく、代わりに空白が含まれている場合です。たとえば、次のようになります。

/main.aspx?page=Page Title One

301パーマネントリダイレクトを行いたい:

/main.aspx?page=Page+Title+One

これを行うには、クエリ文字列の値にプラスまたは空白が含まれているかどうかを確認する必要がありますが、Request.QueryString["page"] で値を取得すると、実際のクエリ文字列にプラスが含まれていても文字列が取得されます空白の「ページ タイトル 1」。

このサイトは IIS6/Win 2003 で動作します。

これどうやってするの?

4

4 に答える 4

5

を使用するRequest["key"]と、すべての「+」記号が自動的にスペースに変換されます。Request.RawUrlプラス記号があるかどうかを確認するために使用する必要があります。

さらに、を使用System.Web.HttpUtility.ParseQueryStringして任意の文字列クエリを解析できます。trueかどうかをテストRequest.QueryString.ToString().Contains("+")し、そこからロジックを実行できます。

于 2011-12-21T20:29:49.950 に答える
3

記号は、+URL のスペースとして解釈されます。

つまり、スペースを URL エンコードするには、%20または+.

「スペース文字をエンコードする URL: + または %20?」に対するこの SO の回答を参照してください。

于 2011-12-21T20:28:42.180 に答える
2

もちろん、どのような場合でも URI にスペースを入れることはできません。あなたができることは、クエリ部分でスペースをエンコードする通常の方法である%20だけでなく、URI の任意のポイントでスペースを+エンコードする方法であり、その部分でそうするために推奨される方法です。 %20 は問題を引き起こす可能性があります。

これは実装の詳細 application/x-www-form-urlencoded であるため、通常、送信される実際のデータを気にRequest.QueryString[]し、エスケープ解除を行い、 と の両方+%20スペースに変換します。

Request.RawUrl(string を返す) またはRequest.Urlwhich を返すを見たいとしますUri。おそらく最も簡単なのは にフィードRequest.UrlするUriBuilderことで、クエリだけを変更して元にUri戻すことができます。

それでも、逆のアプローチをお勧めします。クエリ文字列内のスペースをエンコードする 2 つの方法が原因でコンテンツの重複に問題がある場合は、推奨される基準に従い、他の方法ではなくのケース%20を変更することをお勧めします。+その周り。

var u = Request.Url;
if(u.Query.Contains("%20"))
{
    var ub = new UriBuilder(u);
    Console.WriteLine(ub.Query);
    string query = ub.Query;
    //note bug in Query property - it includes ? in get and expects it not to be there on set
    ub.Query = ub.Query.Replace("%20", "+").Substring(1);
    Response.StatusCode = 301;
    Response.RedirectLocation = ub.Uri.AbsoluteUri;
    Response.End();
}
于 2011-12-21T20:36:32.427 に答える
0

これを試すことができます:

Request.QueryString["page"].Trim();
于 2015-01-08T15:28:22.940 に答える