Это можно решить двумя способами в каждой версии ASP.NET от 1.0 и выше. Я знаю, что прошло два года после создания этой темы, но в любом случае, вот так:
Причина
Создание собственного обработчика ошибок или настройка пользовательской страницы в IIS для перенаправления 404 не будет работать. Причина в том, что ASP.NET считает этот URL опасным. Внутри System.Web.Util.FileUtil
ASP.NET вызывает закрытый метод IsSuspiciousPhysicalPath
, который пытается сопоставить путь к (виртуальному, но допустимому) имени файла.
Когда результирующий легализованный путь не равен исходному пути, обработка останавливается, и код ASP.NET возвращает 404 (он не запрашивает IIS или web.config для пользовательского 404, он сам возвращает один, что делает так трудно что-то с этим делать).
Проводник Windows работает аналогично. Попробуйте создать имя файла, заканчивающееся одной или несколькими точками, т.е. test.txt.
. Вы обнаружите, что полученное имя text.txt
.
Решение для окончания URL в точке в ASP.NET
Решение простое (если вы его знаете, оно всегда есть). Непосредственно перед отправкой этих 404 он вызовет Application_PreSendRequestHeaders
, простое событие, которое вы можете зарегистрировать в Global.asax.cs
(или VB-эквивалент). Следующий код вернет браузеру простой текст, но возможен также Redirect или любой другой действительный ответ.
protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
{
HttpResponse response = this.Context.Response;
HttpRequest request = this.Context.Request;
if (request.RawUrl.EndsWith("."))
{
response.ClearContent();
response.StatusCode = 200;
response.StatusDescription = "OK";
response.SuppressContent = false;
response.ContentType = "text/plain";
response.Write("You have dot at the end of the url, this is allowed, but not by ASP.NET, but I caught you!");
response.End();
}
}
Примечание: этот код также работает, когда "aspx" является , а не частью URL. Т.е., http://example.com/app/somepath. вызовет это событие. Также обратите внимание, что некоторые пути по-прежнему не будут работать (заканчивающиеся несколькими точками, хеш-тегом или, например, знаком <-sign, вызывают запрос 400-Bad). Опять же, он работает для окончания на кавычке, пробеле + косой черте или нескольких точках, разделенных пробелами. </p>