web-dev-qa-db-ja.com

Request.Querystringは自動的に文字列をURLデコードしますか?

私は次のようなURLを持っているページで作業しています:
/directory/company/manufacturer

いくつかの書き換えルールを使用して、これは書き換えられます

/ directory/company/dunkin%26donuts /を使用したテスト

一部のメーカーは、名前にアンパサンドが付いています。そのため、アンパサンドを%26に置き換えることができると思いました。ただし、コードをデバッグしてRequest.QueryStringにカーソルを合わせると、{qq=company&manf=dunkin&donuts&cond=}Request.QueryString["manf"]が「ダンキン」を表示します。

アンパサンドの代わりに%24($)を使用すると、Request.QueryStringにカーソルを合わせると{qs=company&manf=dunkin%24donuts&cond=}Request.QueryString["manf"]が表示され、 'dunkin $ donuts'が表示されます

ここで異なる動作を理解していません。アンパサンドのurlエンコードされた値が実際に特定のキーを要求する前にデコードされるように見えるのに、ドル記号などの別のurlエンコードされた文字は、実際にその特定のキーを要求した後にのみデコードされるように見えるのはなぜですか?

これは最近の変更ですか? Request.QueryString[key]は最初にデコードせずに実際のテキストを返すといつも思っていました。または、URLの書き換えと関係がありますか?

23
merk

アンパサンドを%26に置き換えると、その値がエスケープされるため、Request.QueryString["manf"]dunkin&donutsを生成します。

この同様の質問 の質問者は、同じページの他のコードがアンパサンドを事前にデコードすることに気付いた。同様のことが起こっている可能性はありますか?おそらく、JavaScriptがサーバーに送信する前に%26をアンパサンドにデコードしている可能性があります。 FirebugまたはChromeの開発者ツールを使用して、ブラウザーから送信されている実際のURL文字列を確認してください。

更新

質問をもう一度見てみると、おそらくURLリライタを使用していることがわかります。 この投稿 は同様の問題を説明しており、確実な解決策はわかりませんが、%2526の代わりに%26を使用してアンパサンドを二重エンコードしてみてください。 。

9

キーインデックスによってプロパティにアクセスすると、ASP.NETは自動的にUrlDecode()を呼び出します(つまり(_Request.QueryString["key"]_)。

エンコードする場合は、次のようにします。

HttpUtility.UrlEncode(Request.QueryString["key"]);

特にアンパサンドに関しては、クエリ文字列デリミタとして既に使用されているため、これは特殊なケース文字です。アンパーサンドをURLエンコードおよびデコードすると、その理由から常に_&_が得られます。

35
mattytommo

解決策は、UrlRewriteルールを次のようなものに変更することだと思います。

    <rule name="TagPage" stopProcessing="true">
      <match url="^(tag)/([^/]+)/?$"/>
      <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
      </conditions>
      <action type="Rewrite" url="ListByTags.aspx?tag={UrlEncode:{R:2}}"/>
    </rule>

ここで重要な行は{UrlEncode:{R:2}}です。それは私のために問題を解決しました!

3
Olaj