У меня есть URL-адреса, хранящиеся в базе данных, где пробелы кодируются как +
.
Когда браузер запрашивает эти URL-адреса, веб-сервер возвращает ответ 404.
Все эти URL-адреса предназначены для статических изображений, хранящихся на веб-сервере в папке wwwroot.
Если я вручную изменю +
на %20
, изображение вернется правильно.
Это преднамеренное изменение в ASP.Net Core или это ошибка?
Если это умышленно, мне будет очень больно просматривать базу данных и перекодировать все URL-адреса, многие из которых встроены в фрагменты HTML (я знаю, что хранить HTML в БД или иметь пробелы в файлах изображений не хорошая идея, но она была сделана задолго до того, как я присоединился к компании, и это состояние, в котором мы уже находимся).
Я использую ASP.Net 2.1, работающий на .Net Framework.
В данный момент он работает через IIS Express (в процессе разработки), но будет развернут с полным IIS.
Я видел этот другой вопрос, но он определенно связан с вызовами API, и кажется, что ответ не применим к моему вопросу, поскольку нет маршрутов для изменения, поскольку я запрашиваю статическое изображение файлы.
Редактировать: дополнительные детали
HTML выводится с использованием @Html.Raw(html)
Результирующий вывод html в браузер имеет вид
<img src="/BorderThemes/grey+4px+rounded+corners_TL.png" />
HTML был сгенерирован на сервере, а затем сохранен в БД, поэтому мы можем быть уверены, что его можно безопасно выводить в браузер, и, нет, я понятия не имею, почему кто-то сделал бы это вместо создания HTML, когда это необходимо, но это было до моего времени, и это ситуация, в которой я уже нахожусь.
Обновление:
Я углубился в это, и если я ввожу http://localhost:8000/BorderThemes/grey+4px+rounded+corners_TL.png
в свой веб-браузер, я получаю страницу от IIS с сообщением Http Error 404.11, в котором говорится, что мой URL-адрес имеет двойную кодировку, и для получения дополнительной информации ссылка на здесь . Это включает в себя инструкции о том, как разрешить двойное кодирование, но с предупреждениями о том, что это может иметь последствия для безопасности.
Если я введу URL http://localhost:8000/BorderThemes/grey%204px%20rounded%20corners_TL.png
, я получу изображение обратно.
У меня были проблемы с paths / html, хранящимися в БД, но после эксперимента оказалось, что System.Net.WebUtility.UrlEncode
кодирует пробелы как +
. Например, WebUtility.UrlEncode("foo bar.png")
возвращает foo+bar.png
, который отклоняется в IIS с двойным кодированием.
Я что-то упустил или функция Microsoft для кодирования URL-адресов, кодирующая URL-адреса таким способом, который веб-сервер Microsoft отклоняет?