删除服务器响应头IIS7


107

有什么方法可以从IIS7中删除“服务器”响应标头?有一些文章显示,使用HttpModules可以实现相同的目的。如果我们没有服务器的管理权限,这将很有帮助。我也不想写ISAPI过滤器。

我具有服务器的管理员权限。所以我不想做以上的事情。所以,请帮助我做同样的事情。


Answers:


111

将此添加到您的global.asax.cs中:

protected void Application_PreSendRequestHeaders()
{
    Response.Headers.Remove("Server");
    Response.Headers.Remove("X-AspNet-Version");
    Response.Headers.Remove("X-AspNetMvc-Version");
}

11
不知道为什么http模块的答案比这个答案要高,这个答案要容易得多
jjxtra 2011年

2
NullReferenceException如果您依靠,可能会在Cassini中找到一个HttpContext.Current这篇博客文章显示了如何做到一点,同时又避免了对Cassini的支持(如果这对您很重要)。
Owen Blacker 2012年

49
@PsychoDad这仅适用于ASP.NET请求,不适用于.css和.js之类的静态文件
Max Toro

1
要摆脱MVC标头,可以执行以下操作:MvcHandler.DisableMvcResponseHeader = true;
ProVega

7
PreSendRequestHeaders在实现IHttpModule或的类中使用in 并不是一个好主意Global.asax。我目睹了在压力负荷下冻结服务器上的应用程序的事件。该BeginRequest事件应该可以使响应头更改。参见hanselman.com/blog/ChecklistWhatNOTToDoInASPNET.aspx
德米特里(Dmitry S)

77

在IIS7中,您必须使用HTTP模块。在VS中将以下内容构建为类库:

namespace StrongNamespace.HttpModules
{
  public class CustomHeaderModule : IHttpModule
  { 
    public void Init(HttpApplication context)
    {
      context.PreSendRequestHeaders += OnPreSendRequestHeaders;
    } 

    public void Dispose() { } 

    void OnPreSendRequestHeaders(object sender, EventArgs e)
    {
      HttpContext.Current.Response.Headers.Set("Server", "Box of Bolts");
    }
  }
}

然后,将以下内容添加到web.config中,或者在IIS中进行配置(如果在IIS中进行配置,则程序集必须在GAC中)。

<configuration>
  <system.webServer>
    <modules>
      <add name="CustomHeaderModule"
       type="StrongNamespace.HttpModules.CustomHeaderModule" />
    </modules>
  </system.webServer>
</configuration>

太好了,我也可以对此进行调整,以删除整个服务器场中的ETag标头。
devstuff

这会在casini中导致运行时错误... / ASP.NET Dev服务器
UpTheCreek 2011年

2
@UpTheCreek ASP.Net开发服务器(Cassini)不喜欢该代码;不过,此博客文章对此有解决方案-您需要检查the HttpApplication,the HttpRequest,the HttpContext和the HttpResponseare不是null,并检查HttpRequest.IsLocalis false
Owen Blacker 2012年

2
由于修改标头中的内容PreSendRequestHeaders可能导致HttpCacheModule出现问题,因此应改用类似的内容PostReleaseRequestState
Eirik H 2013年

5
当IIS为静态文件(css / less / images / etc)发送304 Not Modified头时,该模块不会被调用,因为它没有到达ASP.NET管道,因此在这种情况下,服务器:Microsoft IIS / 7.5仍然呈现
Jano

42

与URL重写模块版本2.0 IIS(UrlRewrite)启用,在配置部<configuration><system.webServer><rewrite>添加出站规则:

<outboundRules>
  <rule name="Remove RESPONSE_Server" >
    <match serverVariable="RESPONSE_Server" pattern=".+" />
    <action type="Rewrite" value="" />
  </rule>
</outboundRules>

11
请注意,这只会使Server标头空白,而不会删除它。
尼克·埃文斯

对不起,很抱歉,但是我应该添加到哪一部分?我尝试将其添加到<system.webServer>中
Vignesh Subramanian

1
谢谢!在IIS 8.5中工作,这很容易。我没有文本编辑器,但您可以轻松使用GUI。名称应该是RESPONSE_Server,而不仅仅是Server(这是我最初失败的地方)。
Louis Matthijssen 2014年

如果您有一个非ASP.Net应用程序,这就足够了,因为您无法删除带有上述代码的服务器标头
mhesabi 2015年

4
@vignesh,这是一些UrlRewrite配置子节点。您必须将它们放在中的rewrite节点下system.webServer。请注意,如果服务器上未安装UrlRewrite,这将使您的站点崩溃。而且,您最好首先使用IIS配置控制台来检查它如何记下那些配置节点。
弗雷德里克

36

Scott Mitchell在博客文章中提供了删除不必要的标题的解决方案。

就像在其他答案中已经说过的那样,对于Server标头,有http模块解决方案IIS 10+web.config解决方案,或者您可以使用URLRewrite代替它

最新的(IIS 10 +)设置的最实用解决方案是removeServerHeader在web.config中使用:

<system.webServer>
  ...
  <security>
    <requestFiltering removeServerHeader="true" />
  </security>
  ...
</system.webServer>

对于X-AspNet-VersionX-AspNetMvc-Version,他提供了比在每个响应上都将它们删除的更好的方法:根本不生成它们。

使用enableVersionHeader禁用X-AspNet-Version,在web.config中

<system.web>
  ...
  <httpRuntime enableVersionHeader="false" />
  ...
</system.web>

使用MvcHandler.DisableMvcResponseHeader在.net Application_Start事件禁用X-AspNetMvc-Version

MvcHandler.DisableMvcResponseHeader = true;

最后,在IIS配置中删除X-Powered-Byweb.config中的自定义标头。

<system.webServer>
  ...
  <httpProtocol>
    <customHeaders>
      <remove name="X-Powered-By" />
    </customHeaders>
  </httpProtocol>
  ...
</system.webServer>

请注意,如果您具有ARR(应用程序请求路由),它还将添加自己的X-Powered-By,不会被自定义标头设置删除。必须通过IIS根目录(而不是站点)上的IIS管理器和编辑器配置删除此目录:转到system.webServer/proxy节点并设置arrResponseHeaderfalse。之后IISReset,将其考虑在内。
(我在这里找到了这个,除了这篇文章是关于旧的IIS 6.0配置方式的。)

不要忘记,默认情况下,应用程序代码解决方案不适用于在静态内容上生成的标头(您可以激活runAllManagedModulesForAllRequests来更改标头,但这会导致所有请求运行.Net管道)。这不是问题,X-AspNetMvc-Version因为它没有添加到静态内容上(至少如果静态请求未在.Net管道中运行)。

旁注:当目的是隐瞒使用过的技术时,您还应该更改标准.Net cookie名称(.ASPXAUTH如果激活了表单身份验证(在web.config中的标签name上使用属性forms),ASP.NET_SessionId<sessionState cookieName="yourName" />在web.config中的system.web标签下使用),__RequestVerificationToken(更改它的代码AntiForgeryConfig.CookieName,但不幸的是不适用于此系统在html中生成的隐藏输入)。


18

实际上,上面显示的编码模块和Global.asax示例仅适用于有效请求。

例如,在URL末尾添加<,您将获得一个“错误请求”页面,该页面仍显示服务器标头。许多开发人员忽略了这一点。

显示的注册表设置也不起作用。URLScan是删除“服务器”标头的唯一方法(至少在IIS 7.5中)。


它对我来说与编码模块一起工作(添加到web.config中),即使是在错误的请求下也是如此;)在global.asax中,它实际上并没有工作(例如,静态文件等)
kapsiR 2014年

希望您仍然可以打开请求验证。
Dan Ware 2014年

1
有没有人可以用IIS 8+的urlscan替代?
herostwist

至少在IIS10 +中有一个有效的解决方案:stackoverflow.com/a/53222967/1671558
Ilya Chernomordik,

16

或添加web.config:

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <remove name="X-AspNet-Version" />
            <remove name="X-AspNetMvc-Version" />
            <remove name="X-Powered-By" />
            <!-- <remove name="Server" />  this one doesn't work -->
        </customHeaders>
    </httpProtocol>
</system.webServer>

3
此方法不会删除“服务器”标头。其他被删除。
Pure.Krome 2014年

您可以在服务器级别的Response标头配置中摆脱X-Powered-By。
Snowburnt

1
我不知道是否有这种情况下删除X-AspNet-VersionX-AspNetMvc-Version标头的情况。我所知道的是这种方式并不总是有效(如果可行的话)。有关删除它们的更可靠方法,请参见@Frederic答案。
TheBlueSky 2015年

IIS10 +中现在有一种方法可以删除服务器标头:stackoverflow.com/a/53222946/1671558
Ilya Chernomordik,

14

web.config安装程序可以从ASP.NET响应中删除所有不必要的标头(至少从IIS 10开始):

<!--Removes version headers from response -->
<httpRuntime enableVersionHeader="false" />

<httpProtocol>
  <customHeaders>
    <!--Removes X-Powered-By header from response -->
    <clear />
  </customHeaders>
</httpProtocol>

<security>
  <!--Removes Server header from response-->
  <requestFiltering removeServerHeader ="true" />
</security>

请注意,这将隐藏“应用程序”的所有标头,其他所有方法也是如此。如果您到达应用程序外部的IIS本身或ASP.NET生成的某些默认页面或错误页面,则这些规则将不适用。因此,理想情况下,它们应位于IIS的根级别,并且该底线可能会对IIS本身留下一些错误响应。

PS:IIS 10中存在一个错误,即使使用正确的配置,它有时也会显示服务器标头。现在应该修复它,但是必须更新IIS / Windows。


12

除了URL Rewrite答案,这是的完整XMLweb.config

<system.webServer>
  <rewrite>
    <outboundRules>
      <rule name="Remove RESPONSE_Server" >
        <match serverVariable="RESPONSE_Server" pattern=".+" />
        <action type="Rewrite" value="Company name" />
      </rule>
    </outboundRules>
  </rewrite>
</system.webServer>

URL重写


这会从黑客中删除所有IIS和ASP版本

1
上面的修复程序在网页上正常运行。但是对于图像/图标,如果发生500 Internal Server Error,则显示服务器:Microsoft-IIS / 7.5而不是
value

11

要删除Server:标题,请转到Global.asax,找到/创建Application_PreSendRequestHeaders事件,并按如下所示添加一行(感谢BK此博客在Cassini /本地开发人员上也不会失败):

protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
{
    // Remove the "Server" HTTP Header from response
    HttpApplication app = sender as HttpApplication;
    if (null != app && null != app.Request && !app.Request.IsLocal &&
        null != app.Context && null != app.Context.Response)
    {
        NameValueCollection headers = app.Context.Response.Headers;
        if (null != headers)
        {
            headers.Remove("Server");
        }
    }
}

如果您想要一个完整的解决方案来删除Azure / IIS7上的所有相关标头并且还可以与Cassini一起使用,请参见此链接,其中显示了无需使用HttpModules或URLScan即可禁用这些标头的最佳方法。


9

如果只想删除标题,则可以使用lukiffer答案的简化版本:

using System.Web;

namespace Site
{
    public sealed class HideServerHeaderModule : IHttpModule
    {
        public void Dispose() { }

        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders +=
            (sender, e) => HttpContext.Current.Response.Headers.Remove("Server");
        }
    }
}

然后在Web.config

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="CustomHeaderModule" type="Site.HideServerHeaderModule" />
  </modules>
</system.webServer>

1
这是最合适的,因为css / js之类的资源将没有Server标头,它无需配置即可从服务器移植到服务器,并且Server Response标头不仅会为空,也不会发送。
亚当·卡维尼斯

我已经看到有评论说runAllManagedModulesForAllRequests =“ true”会减慢您的应用程序的速度,因此不建议这样做。相反,可以使用urlrewrite模块outboundRules清除静态文件的服务器值。britishdeveloper.co.uk/2010/06/…–
Juri

5

尝试将HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\DisableServerHeader注册表项设置为REG_DWORD1


在我们的服务器场中,出现了一种奇怪的情况,该注册表设置似乎是唯一适用于IIS6和IIS7的所有操作系统(W2K8,W2K3)都可以使用的更改。
jerhewet 2012年

2
令人沮丧的是,即使重启虚拟机,这对我也没有任何影响。我们正在Windows Server 2008 R2 Standard“版本6.1(内部版本7601:Service Pack 1)”上运行IIS 7.5。同样,OnPreSendRequestHeaders出于某种原因,我的事件处理程序(参见上文)从不触发。
Owen Blacker 2013年

3
不幸的是,注册表项似乎在IIS 7.5上不起作用
Andrew Csontos


2

跟进eddiegroves的答案,具体取决于URLScan的版本,您可能更喜欢使用RemoveServerHeader=1[options]

我不确定在哪个版本的URLScan中添加了此选项,但是在2.5版及更高版本中已经可用。


2

我找到了一篇文章,解释了为什么我们既需要进行注册表编辑,又需要使用UrlScan之类的工具来在IIS中正确进行设置。我在服务器上对其进行了跟踪,并且可以正常运行:http : //blogs.msdn.com/b/varunm/archive/2013/04/23/remove-unwanted-http-response-headers.aspx。如果您仅使用UrlScan但不进行注册表更改,则在停止World Wide Publishing服务期间,您的服务器将从HTTP.sys文件返回服务器http响应。另外,以下是使用UrlScan工具的常见提示:http : //msdn.microsoft.com/zh-cn/library/ff648552.aspx#ht_urlscan_008


2
请在堆栈溢出中发布您的代码。链接可能会改变和中断,因此发布代码会更有帮助
Blundering Philosopher 2014年

2

在IIS 10中,我们使用与Drew的方法类似的解决方案,即:

using System;
using System.Web;

namespace Common.Web.Modules.Http
{
    /// <summary>
    /// Sets custom headers in all requests (e.g. "Server" header) or simply remove some.
    /// </summary>
    public class CustomHeaderModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders += OnPreSendRequestHeaders;
        }

        public void Dispose() { }

        /// <summary>
        /// Event handler that implements the desired behavior for the PreSendRequestHeaders event,
        /// that occurs just before ASP.NET sends HTTP headers to the client.
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void OnPreSendRequestHeaders(object sender, EventArgs e)
        {
            //HttpContext.Current.Response.Headers.Remove("Server");
            HttpContext.Current.Response.Headers.Set("Server", "MyServer");
        }
    }
}

显然,在您的项目中以及您想要的配置中的模块中添加对该dll的引用:

<system.webServer>
    <modules>
      <!--Use http module to remove/customize IIS "Server" header-->
      <add name="CustomHeaderModule" type="Common.Web.Modules.Http.CustomHeaderModule" />
    </modules>
</system.webServer>

重要说明1:此解决方案需要将应用程序池集设置为集成。

重要说明2:Web应用程序内的所有响应都将受到此影响(包括CSS和JS);


1

我已经对此进行了研究,URLRewrite方法效果很好。似乎找不到任何地方编写的更改。我编写了与PowerShell v2及更高版本兼容的文件,并在IIS 7.5上对其进行了测试。

# Add Allowed Server Variable
    Add-WebConfiguration /system.webServer/rewrite/allowedServerVariables -atIndex 0 -value @{name="RESPONSE_SERVER"}
# Rule Name
    $ruleName = "Remove Server Response Header"
# Add outbound IIS Rewrite Rule
    Add-WebConfigurationProperty -pspath "iis:\" -filter "system.webServer/rewrite/outboundrules" -name "." -value @{name=$ruleName; stopProcessing='False'}
#Set Properties of newly created outbound rule 
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST"  -filter "system.webServer/rewrite/outboundRules/rule[@name='$ruleName']/match" -name "serverVariable" -value "RESPONSE_SERVER"
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST"  -filter "system.webServer/rewrite/outboundRules/rule[@name='$ruleName']/match" -name "pattern" -value ".*"
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST"  -filter "system.webServer/rewrite/outboundRules/rule[@name='$ruleName']/action" -name "type" -value "Rewrite"


1

上面提出的解决方案结合以下方面为我工作。我在这里发布我的方案和解决方案。

对我来说,我想删除以下标头:

  • 服务器
  • X-Powered-by
  • X-AspNet版本
  • X-AspNetMvc版本

我将这些添加到了global.asax中:

<%@ Application Language="C#" %>
<script runat="server">
    protected void Application_PreSendRequestHeaders()
    {
        Response.Headers.Remove("Server");
        Response.Headers.Remove("X-Powered-By");
        Response.Headers.Remove("X-AspNet-Version");
        Response.Headers.Remove("X-AspNetMvc-Version");
    }
</script>

上面的事件没有被触发,因此我在web.config中添加了以下内容,然后它起作用了。

<modules runAllManagedModulesForAllRequests="true" />

为了删除版本标头,我还在web.config中添加了以下内容:

<httpRuntime enableVersionHeader="false" />

web.config中的更改:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
    </system.webServer>
    <system.web>
        <httpRuntime enableVersionHeader="false" />
    </system.web>
</configuration>

希望能帮助到你!


0

我在这里和其他几个类似的堆栈溢出线程上尝试了所有东西。

我挂了一下电话,因为我在进行配置更改后忘记清除浏览器缓存。如果您不这样做,并且文件在本地缓存中,它将使用原始标头(duh)将其提供给您。

我通过删除 runAllManagedModulesForAllRequests 使其大部分工作:

<modules runAllManagedModulesForAllRequests="true">

这从大多数静态文件中删除了多余的标头,但是我仍然大张旗鼓地在WebAPI项目中的某些静态文件上获取了“ Server”标头。

我终于找到并应用了此解决方案,现在所有不需要的标头都消失了:

https://www.dionach.com/blog/easily-remove-unwanted-http-headers-in-iis-70-to-85

讨论他的代码在这里:

https://github.com/Dionach/StripHeaders/releases/tag/v1.0.5

这是一个本机代码模块。它能够删除 Server标头,而不仅是删除值。默认情况下,它删除:

  • 服务器
  • X-Powered-by
  • X-Aspnet版本
  • 服务器:Microsoft-HTTPAPI / 2.0-如果“请求未能传递到IIS”将返回

-1

IIS 7.5和可能更高版本的标头文本存储在 iiscore.dll

使用十六进制编辑器,找到字符串和单词“ Server” 53 65 72 76 65 72,然后将其替换为空字节。在IIS 7.5中,它看起来像这样:

4D 69 63 72 6F 73 6F 66 74 2D 49 49 53 2F 37 2E 35 00 00 00 53 65 72 76 65 72 

与其他方法不同,这不会导致性能下降。标头也会从所有请求中删除,甚至是内部错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.