我正在尝试从我的应用程序中的 HTTP 响应中删除服务器标头。
我在网上看了很多资料,也尝试了很多方法,但都没有效果。
我尝试直接在管道中使用 ASP.NET Core 中间件,遵循这样的示例 video
app.Use(async (context, next) =>
{
context.Response.OnStarting(state =>
{
var httpContext = (HttpContext)state;
httpContext.Response.Headers.Remove("Server");
return Task.CompletedTask;
}, context);
await next.Invoke(context);
});
我也看过这篇post,并且我已明确检查以确保响应中包含“Server”标头:
app.Use(async (context, next) =>
{
context.Response.OnStarting(state =>
{
var httpContext = (HttpContext)state;
if (context.Response?.Headers?.ContainsKey("Server") ?? false)
{
httpContext.Response.Headers.Remove("Server");
}
return Task.CompletedTask;
}, context);
await next.Invoke(context);
});
我还尝试过使用 URL 重写模块,如本视频所示,但它对我不起作用。
最后,我还创建了一个自定义中间件,其中包含我能找到的所有方法来删除此标头。
namespace POCWebAppRewriteUrl
{
public class ResponseHeadersMiddleware
{
private readonly RequestDelegate _next;
public ResponseHeadersMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
context.Response.Headers.Remove("Server");
context.Response.OnStarting(() =>
{
context.Response.Headers.Remove("Server");
return Task.CompletedTask;
});
context.Response.OnCompleted(() =>
{
if (context.Response.Headers.ContainsKey("Server"))
{
context.Response.Headers.Remove("Server");
}
return Task.CompletedTask;
});
await _next(context);
}
}
}
正如您在 Postman 中看到的,我仍然在响应中看到“Server”标头。
请注意,我不想包含 web.config 文件来解决此问题。我已经在该项目的 net Framework 4.7 版本中执行此操作,但现在我正在迁移到 net core 8: 我有这个:
<rewrite>
<outboundRules>
<rule name="Remove Server">
<match serverVariable="RESPONSE_SERVER" pattern=".*"/>
<action type="Rewrite" value="None"/>
</rule>
</outboundRules>
</rewrite>
有什么想法为什么我无法删除标题吗?非常感谢。
您可以在program.cs中执行此操作:
builder.WebHost.UseKestrel(opts => opts.AddServerHeader = false);
或者对于可配置的方法,请执行以下操作:
builder.Services.Configure<KestrelServerOptions>(builder.Configuration.GetSection("Kestrel"));
然后它将遵循 Kestrel 配置,例如来自 appsettings.json:
"Kestrel": {
"AddServerHeader": false,
},
或者从启动参数开始:
--Kestrel:AddServerHeader=false
我不确定当由 IIS 托管时这是否仍然有效。