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

Сервер не распознает% 2b как допустимый путь к изображению

Бег 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 регистрирует запросы, пробелы заменяются знаком плюс. Наличие знака «плюс» в имени может вызвать путаницу при анализе журналов.

Есть три способа исправить это и два способа по-прежнему использовать знак плюса.

  1. allowDoubleEscaping=true - Это позволит двойное экранирование для всего вашего сайта / приложения. В зависимости от содержания это может быть, мягко говоря, нежелательно. Следующая команда установит allowDoubleEscaping=true.

    appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /allowDoubleEscaping:True
    
  2. alwaysAllowedUrls - Фильтрация запросов предлагает подход с использованием белого списка. Если добавить этот URL-путь в alwaysAllowedUrls, запрос не будет проверяться никакими другими параметрами фильтрации запросов и продолжится в конвейере запросов IIS. Проблема здесь в том, что фильтрация запросов не будет проверять запрос на:

    • Пределы запросов: maxContentLength, maxUrl, maxQueryString
    • Глаголы
    • Запрос - параметры строки запроса проверяться не будут
    • Двойной побег
    • Персонажи с высоким битом
    • Правила фильтрации запросов
    • Ограничения заголовка запроса

    Следующая команда добавит /+.jpg к alwaysAllowedUrls на веб-сайте по умолчанию.

    appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"alwaysAllowedUrls.[url='/+.jpg']"
    
  3. Переименовать - да, просто переименуйте файл / папку, если это возможно. Это самое простое решение.