Бег IIS 7
Я использую учетную запись общего хостинга, и на моем сервере есть файл с именем +.jpg
но когда я пытаюсь перейти к нему через URL
http://example.com/images/%2b.jpg
Сервер не отвечает должным образом, и мой браузер возвращает ошибку «Веб-страница не найдена».
На моей машине разработчика это работает нормально. Какую опцию я должен указать своему хостеру, чтобы он принимал такие URL-адреса?
Похоже, проблема в ошибке 404.11, вызванной двойной escape-последовательностью:
Ошибка HTTP 404.11 - не найдено. Модуль фильтрации запросов настроен на отклонение запроса, содержащего двойную escape-последовательность.
и подробно описано в этом Статья в базе знаний.
Выполнение этой команды:
Appcmd set config "Default Web Site" /section:system.webServer/Security/requestFiltering -allowDoubleEscaping:True
позволяет подавать файл.
В вашем случае вы можете добавить этот раздел в файл web.config вашего приложения:
<requestFiltering allowDoubleEscaping="true" />
как описано в этом Статья в TechNet.
Знак плюс (+) - зарезервированный символ для RFC2396:
Многие URI включают компоненты, состоящие из определенных специальных символов или разделенные ими. Эти символы называются «зарезервированными», поскольку их использование в компоненте URI ограничено их зарезервированной целью. Если данные для компонента URI будут конфликтовать с зарезервированной целью, то конфликтующие данные должны быть экранированы перед формированием URI.
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
У Уэйда Хилмо есть отличный пост под названием Как IIS блокирует символы в URL-адресах. Предоставляется много информации и предыстории. Часть, специально предназначенная для знака плюс, выглядит следующим образом:
Итак, allowDoubleEscaping / VerifyNormalization кажется довольно простым. Почему я сказал, что это вызывает недоумение? Проблема заключается в том, что в URL-адресе появляется символ «+». Символ «+», похоже, не экранирован, поскольку он не включает «%». Кроме того, RFC 2396 отмечает его как зарезервированный символ, который может быть включен в URL-адрес в экранированной форме (% 2b). Но если для параметра allowDoubleEscaping установлено значение по умолчанию false, мы заблокируем его даже в экранированной форме. Причина этого историческая: еще в ранние дни HTTP символ «+» считался сокращением для символа пробела. Некоторые каноникализаторы, когда им задают URL, содержащий "+", преобразуют его в пробел. По этой причине мы считаем "+" в URL неканоническим. Мне не удалось найти ни одной ссылки на RFC, в котором упоминается эта обработка «+», но в Интернете есть много ссылок, в которых говорится об этом как об историческом поведении.
По собственному опыту знаю, что когда IIS регистрирует запросы, пробелы заменяются знаком плюс. Наличие знака «плюс» в имени может вызвать путаницу при анализе журналов.
Есть три способа исправить это и два способа по-прежнему использовать знак плюса.
allowDoubleEscaping=true
- Это позволит двойное экранирование для всего вашего сайта / приложения. В зависимости от содержания это может быть, мягко говоря, нежелательно. Следующая команда установит allowDoubleEscaping=true
.
appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /allowDoubleEscaping:True
alwaysAllowedUrls
- Фильтрация запросов предлагает подход с использованием белого списка. Если добавить этот URL-путь в alwaysAllowedUrls, запрос не будет проверяться никакими другими параметрами фильтрации запросов и продолжится в конвейере запросов IIS. Проблема здесь в том, что фильтрация запросов не будет проверять запрос на:
Следующая команда добавит /+.jpg
к alwaysAllowedUrls
на веб-сайте по умолчанию.
appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"alwaysAllowedUrls.[url='/+.jpg']"
Переименовать - да, просто переименуйте файл / папку, если это возможно. Это самое простое решение.