Назад | Перейти на главную страницу

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

Для любого 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?

После поиска дополнительных комбинаций IIS и Plus оказалось, что 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-адресах.

Я только что понял, как сделать правило перезаписи, чтобы убедить 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>

Видеть мой пост в блоге для получения дополнительных сведений и ссылок.