Выполняет Request.Querystring автоматически расшифровывает строку?
Я работаю со страницей, где у меня есть URL-адрес:
/Каталог/Компания/производитель
Используя некоторые правила перезаписи, это переписывается
тестирование с /directory/company/dunkin % 26donuts/
Некоторые производители имеют амперсанд на свое имя. Поэтому я подумал, что могу просто заменить амперсанд на %26
. Однако, когда я отлаживаю код и наведите указатель мыши на Request.QueryString
, он показывает мне {qq=company&manf=dunkin&donuts&cond=}
и Request.QueryString["manf"]
дает мне "dunkin"
Если я использую %24
($) вместо амперсанда, зависание над Request.QueryString
дает мне
{qs=company&manf=dunkin%24donuts&cond=}
и Request.QueryString["manf"]
дает мне "dunkin $donuts"
Я не понимаю здесь разного поведения. Почему кажется, что кодированное значение url для амперсанда декодируется до того, как вы действительно запросите конкретный ключ, но другой URL-код, как знак доллара, только расшифровывается после того, как вы действительно запросите этот конкретный ключ?
Это недавнее изменение? Я всегда думал, что Request.QueryString[key]
вернул фактический текст без его декодирования. Или это имеет какое-то отношение к перезаписи url?
Ответы
Ответ 1
Замена амперсанда на %26
должна привести к тому, что это значение будет экранировано, поэтому Request.QueryString["manf"]
даст dunkin&donuts
.
Общающийся этот похожий вопрос понял, что какой-то другой код на той же странице закончил предварительное декодирование его амперсандов. Возможно ли, что у вас что-то подобное происходит? Возможно, некоторый javascript расшифровывает %26
в амперсанд перед отправкой его на ваш сервер. Попробуйте использовать инструменты разработчика Firebug или Chrome, чтобы увидеть фактическую строку URL, отправляемую из браузера.
Update
После повторного рассмотрения вопроса я понимаю, что вы, вероятно, используете URL-адрес Rewriter. Этот пост описывает аналогичную проблему, и я точно не знаю о решении, но вы можете попробовать выполнить двойное кодирование амперсанда, используя %2526
вместо %26
.
Ответ 2
ASP.NET автоматически вызывает UrlDecode()
при доступе к свойству по индексу ключа (т.е. (Request.QueryString["key"]
).
Если вы хотите, чтобы он был закодирован, просто выполните:
HttpUtility.UrlEncode(Request.QueryString["key"]);
В терминах амперсанда, в частности, это особый случайный символ, поскольку он уже используется в качестве разделителя строки запроса. URL Кодирование и декодирование амперсанда всегда должны давать вам &
именно по этой причине.
Ответ 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}}. Он решил проблему для меня!