私は次のような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の書き換えと関係がありますか?
アンパサンドを%26
に置き換えると、その値がエスケープされるため、Request.QueryString["manf"]
はdunkin&donuts
を生成します。
この同様の質問 の質問者は、同じページの他のコードがアンパサンドを事前にデコードすることに気付いた。同様のことが起こっている可能性はありますか?おそらく、JavaScriptがサーバーに送信する前に%26
をアンパサンドにデコードしている可能性があります。 FirebugまたはChromeの開発者ツールを使用して、ブラウザーから送信されている実際のURL文字列を確認してください。
質問をもう一度見てみると、おそらくURLリライタを使用していることがわかります。 この投稿 は同様の問題を説明しており、確実な解決策はわかりませんが、%2526
の代わりに%26
を使用してアンパサンドを二重エンコードしてみてください。 。
キーインデックスによってプロパティにアクセスすると、ASP.NETは自動的にUrlDecode()
を呼び出します(つまり(_Request.QueryString["key"]
_)。
エンコードする場合は、次のようにします。
HttpUtility.UrlEncode(Request.QueryString["key"]);
特にアンパサンドに関しては、クエリ文字列デリミタとして既に使用されているため、これは特殊なケース文字です。アンパーサンドをURLエンコードおよびデコードすると、その理由から常に_&
_が得られます。
解決策は、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}}です。それは私のために問題を解決しました!