Подтвердить что ты не робот

Выполняет 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?

4b9b3361

Ответ 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}}. Он решил проблему для меня!