删除在 ASP.NET Core 8 中不起作用的“服务器”标头不适用于中间件或 IIS 管理器

问题描述 投票:0回答:1

我正在尝试从我的应用程序中的 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 重写模块,如本视频所示,但它对我不起作用。

server variable

outbound rule

最后,我还创建了一个自定义中间件,其中包含我能找到的所有方法来删除此标头。

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”标头。

Reponse in postman

请注意,我不想包含 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>

有什么想法为什么我无法删除标题吗?非常感谢。

asp.net-core url-rewriting middleware response-headers
1个回答
0
投票

您可以在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 托管时这是否仍然有效。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.