删除服务器响应标头IIS7

有没有办法从IIS7中删除“服务器”响应头? 有一些文章显示使用HttpModules我们可以达到同样的效果。 如果我们没有pipe理员权限,这将是有帮助的。 另外我不想写ISAPIfilter。

我有我的服务器的pipe理员权限。 所以我不想做以上的东西。 所以,请帮助我也这样做。

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

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

在IIS7中,您必须使用HTTP模块。 在VS中构build以下类库:

 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中对其进行configuration(如果在IIS中进行configuration,程序集必须位于GAC中)。

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

使用IIS UrlRewrite 2.0

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

斯科特·米切尔(Scott Mitchell)在博客文章中提供了删除不必要的标题

正如在其他答案中已经说过的那样,对于Server头,有http模块解决scheme或UrlScan模块。 (URLScan模块在IIS7.5 +中不再可用,使用URLRewrite来代替它) 。

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

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

 <httpRuntime enableVersionHeader="false" /> 

.Net Application_Start事件中使用MvcHandler.DisableMvcResponseHeader以禁用X-AspNetMvc-Version

 MvcHandler.DisableMvcResponseHeader = true; 

最后,在IISconfiguration中删除X-Powered-By自定义标题。

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

注意:当目标是掩饰使用的技术时,您还应该更改标准.Net cookie名称( .ASPXAUTH如果表单auth已激活(在web.config中使用forms标签上的name属性), ASP.NET_SessionId (使用<sessionState cookieName="yourName" />在web.config下的system.web标签), __RequestVerificationToken (通过代码__RequestVerificationToken改变它,但不幸的是不适用于这个系统在html中生成的隐藏input))。

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

例如,在你的URL的末尾添加<,你会得到一个“错误的请求”页面,仍然暴露服务器头。 很多开发者忽略了这一点。

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

或者在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> 

除了URL重写的答案 ,这里是web.config的完整XML

 <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重写

要删除Server:头,转到Global.asax ,find/创buildApplication_PreSendRequestHeaders事件并添加一行,如下所示(感谢BK , 这个博客也不会在Cassini / local dev上失败):

 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"); } } } 

如果您想要一个完整的解决scheme来删除Azure / IIS7上的所有相关头文件,并且也可以与Cassini一起使用,请参阅此链接 , 该链接显示了在不使用HttpModules或URLScan的情况下禁用这些头文件的最佳方法。

如果你只是想删除标题,你可以使用一个缩短版本的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> 

尝试将HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\DisableServerHeaderregistry项设置为1REG_DWORD

UrlScan也可以通过在[options]下使用AlternateServerName=来删除服务器头。

根据eddiegroves的回答 ,根据URLScan的版本,您可能更喜欢RemoveServerHeader=1 [options]

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

我find了一篇文章,解释了为什么我们需要进行registry编辑,并使用UrlScan等工具在IIS中正确设置。 我遵循它在我们的服务器上,它的工作原理: http : //blogs.msdn.com/b/varunm/archive/2013/04/23/remove-unwanted-http-response-headers.aspx 。 如果您只使用UrlScan,但不执行registry更改,则在停止World Wide Publishing服务期间,服务器将从HTTP.sys文件返回服务器http响应。 此外,这里是使用UrlScan工具常见的秘密: http : //msdn.microsoft.com/en-us/library/ff648552.aspx#ht_urlscan_008

在IIS 10中,我们对Drew的方法使用了类似的解决scheme,即:

 using System; using System.Web; namespace Common.Web.Modules.Http { /// <summary> /// Sets custom headers in all requests (eg "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的引用,以及你想要的configuration中的模块:

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