Для любого 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 с различными именами:
Третий файл был тестом, чтобы увидеть, обрабатывает ли 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>
Видеть мой пост в блоге для получения дополнительных сведений и ссылок.