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, который работает как обработчик перехвата всех.

Другие вопросы по тегам