IIS выбрасывает 404 при просмотре каталогов вместо 403, но не для файлов в
Я хотел бы отобразить ошибку 404 not found при просмотре каталога вместо стандартного несанкционированного сообщения 403 от asp.net, но не для файлов внутри. Например:
www.somedomain.com/services - 404 not found
www.somedomain.com/services/test.asmx - 200 ok
Я попытался сделать пользовательский универсальный обработчик, например, так:
public class DirectoryBrowsingAttempt : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.StatusCode = 404;
}
public bool IsReusable
{
get
{
return true;
}
}
}
И в соответствии с web.config:
<handlers>
<add name="NoAccess" verb="*" path="Services" preCondition="integratedMode" type="Namespace.DirectoryBrowsingAttempt"/>
</handlers>
Это выдаст 404 для каталога и файлов внутри. Есть ли способ избежать 404 для файлов?
2 ответа
Вам просто нужно добавить косую черту после пути. Единственное, что мне не нравится в этом, это подпапки. Вы должны добавить конкретную конфигурацию для каждого уровня каталогов.
Если оставить его открытым или добавить звездочку в качестве конца, все файлы по этому пути будут игнорироваться.
<handlers>
<add name="NoAccess" verb="*" path="Services/" preCondition="integratedMode" type="Namespace.DirectoryBrowsingAttempt"/>
</handlers>
Я нашел простое решение для моей проблемы, добавив обработчик подстановочных знаков для файлов в папке служб, которые затем передаются в обработчик System.Web.Script.Services.ScriptHandlerFactory.
<add name="Services" verb="*" path="Services/*" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="ServicesNoAccess" verb="*" path="Services" preCondition="integratedMode" type="System.Web.StaticFileHandler"/>
Также обратите внимание, что универсальный обработчик не обязан бросать 404 для каталога. Вместо этого используйте System.Web.StaticFileHandler, который работает как обработчик перехвата всех.