2011-12-21 13 views
10

私は数年前、すべてのサイトページを表示するために単一のAPSXページを使用するデータベース駆動型ASP.NETサイトを作成しました。だから、サイトのすべてのURLは次の形式である:プラスASP.NETサイトのクエリ文字列

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

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

/main.aspx?page=Third+Page 

main.aspxページには、クエリ文字列データ(ページ+タイトル+例えば1)を取得し、適切な資料を引くためのキーとして使用しますSQLサーバーデータベースの内容。ページの実際のタイトルは、プラスではなくスペースでDBに格納されます(たとえば、 "Page Title One")。

URLクエリ文字列の単語区切り記号として+記号を使用するという貧弱な決定は、最近検索エンジンで問題が発生しているため(コンテンツの複製など)、URLを変更せずに修正したい。私は301恒久的なリダイレクトにやりたい

/main.aspx?page=Page Title One 

:検索エンジンや訪問者が、例えば、+印を逃し、代わりに空白を持つ間違ったURLにアクセスしようとしたとき、私は何をしたいのか

は以下のとおりです。

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

実際quesry文字列がある場合でも、私は、クエリ文字列値がプラスまたは白のスペースを持っている場合、私は場合、Request.QueryString [「ページ」]で値を取得するときしかし、チェックする必要があり、これを行うことができるようにするために私はまだ空白文字列 "ページタイトル1"を取得します。

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

どうすればいいですか?

答えて

2

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

が実装における詳細アプリケーション/ x-www-form-urlencodedであり、我々は正常に送信された実際のデータを気にし、Request.QueryString[]は空間に+%20の両方を回し、あなたのためにアンエスケープを行います。

Request.RawUrl(文字列を返す)またはRequest.UrlUriを返す)を調べたいとします。おそらく最も簡単なのはRequest.UrlUriBuilderに入れて、クエリだけを変更して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(); 
} 
+0

私のURLは、空白または%20の代わりに常にプラス記号のみを使用していますが、Googleでは/main.aspx?page=KW1 KW2と/main.aspx?page=KW1%のようにキャッシュされたページが表示されます20KW2、両方とも間違っており、重複したコンテンツの問題を引き起こしています。今私は301に、/main.aspx?page=KW1+KW2という適切なURLを付けたいと思います。 –

+0

それは私が説明していたこととほとんど同じです。明確ではなかったことが分からないので、うまくいけば説明するコード例を追加しました。 –

+0

ありがとうジョン、これはまさに私が必要なものです:)。質問に答えたものをどのようにマークするのですか? –

3

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

つまり、スペースをURLエンコードするには、%20または+を使用できます。

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

4

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

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

+0

これはまさに私の問題です。私は以下の2つのGETリクエストを区別できるようにしたいと考えています:/main.aspx?page=KW1+KW2と/main.aspx?page=KW1 KW2。 –

+0

私のオリジナルのポストを参照してください。 'Request.QueryString.ToString()。Contains(" + ")'のように思えますが、それが最初か二番目の場合です。 –

+0

はい、これは間違ったURLを/main.aspx?page=KW1 KW2 + KW3の形式では解決しません。 –

0

あなたはこれを試すことができます。

Request.QueryString["page"].Trim(); 
関連する問題