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

IIS7 URL Rewrite breaks для URL, содержащих символы +

У меня есть сервер IIS7, который действует как обратный прокси для нескольких других веб-серверов. Другие серверы работают на других портах, поэтому сервер IIS7 предоставляет «понятные URL-адреса», и все они работают на порту 80. Перезапись URL-адресов используется для передачи запроса внутреннему серверу.

Одним из таких серверов является TeamCity (сервер непрерывной интеграции и сборки). Этот сервер предоставляет способ загрузки результатов сборки («артефакты сборки»). Обычно эти артефакты представляют собой zip-архив. Вот пример URL:

http://build.teamserver.tigranetworks.co.uk/repository/download/bt25/4164:id/ASCOM+Telescope+Driver+for+AWR+6.0.40.825.zip

Символы + в ASCOM+Telescope+Driver+for+AWR+6.0.40.825.zip фактически являются пробелами в конечном имени файла; сервер TeamCity вставляет символы +.

При нажатии на эту ссылку я получаю следующую ошибку с сервера IIS7:

404 - файл или каталог не найден.

Ресурс, который вы ищете, мог быть удален, изменилось его название или временно недоступен.

Фактический URL-адрес, отображаемый в файле журнала IIS7:

/repository/download/bt25/4164:id/ASCOM+Telescope+Driver+for+AWR+6.0.40.825.zip

Правило перезаписи соответствует шаблону (.*) и перезаписывает URL-адрес, используя

http: // локальный: 8022 /{R: 1}

А теперь самое интересное. Если я вернусь в свой браузер и отредактирую эти символы +, тщательно заменив их пробелами, тогда URL-адрес будет работать!

Я прихожу к выводу, что перезапись URL почему-то не работает для этих + символов. Это известная проблема? Какие-либо предложения?

Как уже ответил h0tw1r3, вам нужно отключить проверку URL.

Если вы хотите сделать это на Уровень сервера IIS затем используйте команду ниже:

%windir%\system32\inetsrv\appcmd set config /section:requestfiltering /allowdoubleescaping:true

Если вы хотите отключить его только на уровень приложения, то вам нужно просто добавить следующий раздел в файл web.config:

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true" />
    </security>
</system.webServer>

Символ «+» действительно не является допустимой кодировкой URL для пробела. TeamCity должен кодировать их как% 20.

В любом случае ошибка, вероятно, является результатом распространенного requestFiltering настройка безопасности в IIS7.

Попробуйте следующую команду:

%windir%\system32\inetsrv\appcmd set config /section:requestfiltering /allowdoubleescaping:true

Это должно помешать IIS возвращать 404 для всего, что имеет + в URL-адресе.