如何在Windows IIS中拒绝根路径('/')访问并屏蔽爬虫请求?
IIS下拦截ASP.NET Core API根路径爬虫请求的可行方案
完全可行,你可以通过IIS配置或ASP.NET Core代码层实现需求,既能拦截根路径(/)的爬虫请求、避免日志泛滥,又不会影响/api/开头的正常API调用。以下是具体方案:
方案一:IIS URL重写规则(无需修改代码)
直接通过IIS的URL重写模块拦截根路径请求,还能配置不记录这类请求的日志,从源头解决日志泛滥问题:
- 打开IIS管理器,定位到目标API站点,进入「URL重写」功能
- 添加空白规则,按如下配置:
- 匹配URL:选择「正则表达式」,模式填写
^/$(精准匹配根路径请求) - 操作:选择「自定义响应」,状态码设为
404,状态描述留空或填Not Found - (可选)添加服务器变量
LOG_REQUEST并设为0,让IIS不记录该请求的日志
- 匹配URL:选择「正则表达式」,模式填写
也可以直接编辑站点的web.config文件,在<system.webServer>节点内添加以下配置:
<rewrite> <rules> <rule name="Block Root Requests" stopProcessing="true"> <match url="^/$" /> <action type="CustomResponse" statusCode="404" statusReason="Not Found" statusDescription="The requested resource does not exist." /> <serverVariables> <set name="LOG_REQUEST" value="0" /> </serverVariables> </rule> </rules> </rewrite>
方案二:ASP.NET Core中间件(代码层面管控)
如果需要跨部署环境生效,或者希望在代码里统一处理,可以添加自定义中间件拦截根路径请求:
在Program.cs(.NET 6+)的管道配置中,在路由注册前添加以下中间件:
// 拦截根路径请求,在UseRouting之前添加以确保优先处理 app.Use(async (context, next) => { if (context.Request.Path == "/") { context.Response.StatusCode = StatusCodes.Status404NotFound; await context.Response.WriteAsync(string.Empty); return; } await next(); }); app.UseRouting(); // 后续的API路由配置...
如果要避免日志记录这类请求,可在appsettings.json中添加日志过滤规则:
"Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" }, "Filters": [ { "Name": "RequestPath", "Args": { "Path": "/", "LogLevel": "None" } } ] }
进阶优化:仅拦截爬虫请求
如果不想拦截所有根路径请求(比如后续可能添加正常访问场景),可以在IIS规则中添加User-Agent条件,只拦截常见爬虫的请求:
在规则的<conditions>节点中添加:
<conditions> <add input="{HTTP_USER_AGENT}" pattern="bot|crawl|spider|scraper" ignoreCase="true" /> </conditions>
内容的提问来源于stack exchange,提问作者sommmen
相关产品推荐
相关产品推荐

