Веб-сайты Azure выдают ошибку 500, если в URL есть двоеточие
Внешние клиенты загружают мой веб-сайт Azure URL-адресами, содержащими символ двоеточия (:). Запрос недействителен, но на моем старом IIS-сервере он выдаст ошибку 404. В Azure этот же URL-адрес выдаст ошибку 500. Это тратит впустую мое время, поскольку я должен проверить журналы. Это пример запроса:
http://www.example.com/http:/www.example.com
Есть ли способ избежать этого поведения на стороне сервера и вместо этого выдавать ошибку 4xx? Имейте в виду, что эта проблема только в Azure, и я не контролирую запросы.
2 ответа
Если вы запускаете приложение.NET, то это вызвано ASP.NET HTTP runtime, более конкретно его функцией фильтрации запросов.
Если путь URL содержит любой из запрещенных символов (<,>,*,%,&,:,\\,?
), среда выполнения выдает исключение, и из-за исключения IIS возвращает код ошибки 500.
System.Web.HttpException: потенциально опасное значение Request.Path было обнаружено от клиента (:).
Вы можете настроить запрещенные символы в вашем web.config
файл.
<system.web>
<httpRuntime targetFramework="4.5" requestPathInvalidCharacters="*,%" />
</system.web>
Но я был бы осторожен, потому что такие изменения могут иметь некоторые последствия для безопасности.
С помощью консоли KUDU в Azure добавьте файл applicationhost.xdt в папку D:\home\site.
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document- Transform">
<system.applicationHost>
<sites>
<site name="%XDT_SITENAME%" xdt:Locator="Match(name)">
<virtualDirectoryDefaults xdt:Transform="Insert" allowSubDirConfig="false" />
</site>
</sites>
Это делает работу, но имеет нежелательный побочный эффект, поскольку любой файл web.config в любом подкаталоге приложения игнорируется. С нашей стороны, это привело к тому, что статические файлы не загружались, что означало, что сайт не работал должным образом.
Это будет хорошо работать для любого сайта, имеющего один web.config на корневом уровне.