IIS6 против IIS7 и IIS7.5: обработка URL со знаком плюс (+) в базе (не строка запроса)

39

Для любого URL со знаком плюс (+) в базовом URL (не в строке запроса) IIS7 и IIS7.5 (Windows Server 2008 и 2008 R2) не отображаются для пересылки URL-адреса обработчику по умолчанию в приложении ASP.NET , Я начал замечать проблему с пользовательским обработчиком HTTP, *.htmlно у меня та же проблема с *.aspx. IIS6 (Server 2003) не имеет проблем с теми же URL-адресами.

Чтобы повторить проблему, на сайте ASP.NET я создал набор файлов ASPX, которые выполняли простой Response.Write с различными именами:

  1. test_something.aspx
  2. test_some + thing.aspx
  3. test_some thing.aspx

Третий файл был тестом, чтобы увидеть, обрабатывает ли IIS7 [.5] символы плюс как пробелы (как это было бы в строке запроса); это не похоже на случай. Со всеми этими файлами на месте, ударил http://somehost/test_some+thing.aspxили http://somehost/test_some%2bthing.aspxбудет хорошо работать в IIS6, но 404 в IIS7 / IIS7.5, прежде чем добраться до любого обработчика ASP.NET. Есть ли какая-то конфигурация в IIS7 / 7.5, которую мне не хватает, чтобы заставить ее «видеть» знак плюс в URL, не пропуская последнее расширение, используемое для определения обработчика HTTP?

Patridge
источник
Интересно, поможет ли экранирование знака плюс? Может быть \+?
Приостановлено до дальнейшего уведомления.

Ответы:

40

После поиска дополнительных комбинаций IIS и плюса, IIS7 [.5] настроен на отклонение URL со знаком плюс по умолчанию из-за боязни использования этого символа; этот символ все еще разрешен в строке запроса. Решение заключается в изменении атрибута requestFiltering по умолчанию на , <system><webServer><security><requestFiltering>чтобы дважды закодированные символы с вызовом командной строки ( в конечном счете , модифицируя ASP.NET web.config):

%windir%\system32\inetsrv\appcmd set config "Default Web Site" -section:system.webServer/security/requestFiltering -allowDoubleEscaping:true

Это может быть немного более опасно, чем кто-либо предпочитает быть на их веб-сайте, но, похоже, не было способа быть более конкретным, чем тот, который позволяет. Предупреждения касались несоответствия, которое могло произойти между использованием плюса в URL и его типичным переводом в качестве пробела. Похоже, единственная альтернатива - вообще не использовать плюсовые символы в ваших URL.

Patridge
источник
2
Просто к вашему сведению: вам не нужно делать это на шаблоне корневого уровня. Это можно сделать в любом файле Web.config или применить к подпапке с тегом <location />.
mdonatas
В диспетчере IIS: Сайты => YourSite => Фильтрация запросов => Изменить настройки функций ... => Установите флажок Разрешить двойное экранирование => OK
diynevala
9

Я только что понял, как создать правило перезаписи, чтобы убедить IIS7 сопоставлять плюсы пробелам в URL. В моем случае это было для сохранения старых закладок или гиперссылок.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <security>
      <requestFiltering allowDoubleEscaping="True" />
    </security>
    <rewrite>
      <rules>
        <rule name="RewriteUserFriendlyURL1" stopProcessing="false">
          <match url="\+" />
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Rewrite" url="{UrlDecode:{REQUEST_URI}}" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

Смотрите мой блог для более подробной информации и ссылок.

Натан
источник
1
Я решил проблему, когда мне нужно было поддерживать устаревшие URL-адреса со знаком плюс в строке запроса, используя только раздел безопасности выше, то есть, установив allowDoubleEscaping в значение «True».
Стивен
У меня есть уникальный случай - некоторые устаревшие URL имеют два последовательных плюса, то есть «++». IIS, кажется, имеет специальное правило против этого. Любые идеи?
Boomhauer
@boomhauer вам может понадобиться написать обработчик ... или использовать другой веб-сервер для размещения этих URL? Однажды я заставил Apache mod_rewrite обрабатывать несколько устаревших URL-адресов и перенаправлять их в различные новые места, и это казалось немного более гибким.
Натан