24


/directory/company/manufacturerのような URL を持つページで作業しています。

いくつかの書き換えルールを使用すると、これが書き換えられます

/directory/company/dunkin%26donuts/ でのテスト

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

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

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

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

4

3 に答える 3

43

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

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

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

特にアンパサンドに関しては、クエリ文字列の区切り文字として既に使用されているため、特殊文字です。アンパサンドを URL エンコードおよびデコードすると&、まさにその理由が常に表示されます。

于 2012-10-26T22:52:36.263 に答える
10

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

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

アップデート

質問をもう一度見てみると、おそらく URL Rewriter を使用していることがわかりました。この投稿は同様の問題について説明しており、確かな解決策はわかりませんが、 の%2526代わりに%26.

于 2012-10-26T23:08:44.610 に答える
3

解決策は、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}} です。それは私のために問題を解決しました!

于 2012-12-20T10:31:23.787 に答える