有什么办法删除从IIS7“服务器”响应头? 有一些文章表明使用的HttpModules就可以达到同样的事情。 这将是有益的,如果我们没有服务器管理权。 此外,我不想写ISAPI筛选器。
我有管理员权限到我的服务器。 所以,我不想做上面的东西。 所以,请帮我做同样的。
有什么办法删除从IIS7“服务器”响应头? 有一些文章表明使用的HttpModules就可以达到同样的事情。 这将是有益的,如果我们没有服务器管理权。 此外,我不想写ISAPI筛选器。
我有管理员权限到我的服务器。 所以,我不想做上面的东西。 所以,请帮我做同样的。
添加到您的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类库:
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>
使用IIS UrlRewrite 2.0
<outboundRules>
<rule name="Remove RESPONSE_Server" >
<match serverVariable="RESPONSE_Server" pattern=".+" />
<action type="Rewrite" value="" />
</rule>
</outboundRules>
斯科特·米切尔提供在一篇博客文章中的解决方案消除不必要的头 。
前面已经说了在其他的答案在这里,对于Server
头,还有就是HTTP模块的解决方案或UrlScan的模块。 (URLScan的模块没有在IIS7.5 +更多的可用。使用URLRewrite而不是为空白它 。)
对于X-AspNet-Version
和X-AspNetMvc-Version
,他提供了比对每个响应消除他们一个更好的方法:根本就没有产生他们。
使用enableVersionHeader
禁用X-AspNet-Version
,在web.config中
<httpRuntime enableVersionHeader="false" />
使用MvcHandler.DisableMvcResponseHeader
在.net Application_Start事件禁用X-AspNetMvc-Version
MvcHandler.DisableMvcResponseHeader = true;
最后,在IIS配置中删除X-Powered-By
自定义标题。 (这可以在web.config中,来完成configuration/system.webServer/httpProtocol/customHeaders/remove[name=X-Powered-By]
)
当心,如果你有ARR(应用程序请求路由),这也将增加其自身的X-Powered-By
,这将不会被自定义页眉设置来移除。 这其中必须通过IIS管理器中删除,在IIS根(而不是在一个网站)编辑器的配置:去system.webServer/proxy
节点并设置arrResponseHeader
给false
。 一个经过IISReset
,它被考虑在内。
(我发现这一个位置 ,这个除外职位是关于老IIS配置的东西的6.0方式。)
不要忘记应用程序代码的解决方案默认情况下不适用头球静态内容而产生的(你可以激活runAllManagedModulesForAllRequests
改变这一点,但它会导致所有的请求运行的.Net管道)。 这不是一个问题, X-AspNetMvc-Version
,因为它不是静态的内容加入(至少如果静态请求没有在净管道运行)。
附注:当目的是为了掩盖使用的技术,你也应该改变标准.NET cookie名称( .ASPXAUTH
如果窗体身份验证激活(使用name
上属性forms
在web.config中的标签), ASP.NET_SessionId
(使用<sessionState cookieName="yourName" />
下的web.config system.web
标记), __RequestVerificationToken
(通过用代码改变它AntiForgeryConfig.CookieName
,但不幸的是不适用于隐藏的输入此系统产生在html))。
实际上,编码模块和上面仅显示在Global.asax中的实例工作了有效的请求。
例如,添加<你的网址的结尾,你会得到一个“错误的请求”页面仍然暴露了服务器头。 很多开发商忽视这一点。
显示的注册表设置也不能工作。 URLScan是除去(至少在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重写答案 ,这里是完整的XML web.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重写
要删除Server:
头,去Global.asax
,找到/创建Application_PreSendRequestHeaders
事件,并添加一行如下(由于BK和这个博客 ,这也不会对卡西尼/本地开发失败):
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");
}
}
}
如果你想有一个完整的解决方案,以消除天青/ IIS7所有相关的标题和还与卡西尼,看到这个链接 ,它显示出最佳的方法来禁用这些头不使用的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>
此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已经被更新。
尝试设置HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\DisableServerHeader
注册表项设置为REG_DWORD
的1
。
UrlScan的还可以通过使用删除的服务器报头AlternateServerName=
下[options]
。
在跟进eddiegroves的回答 ,取决于URLScan的版本,你可以改为更喜欢RemoveServerHeader=1
下的[options]
。
我不知道在其中加入这个选项URLScan的版本,但它在2.5及以后的版本已经可用。
我发现解释了为什么我们需要做两个注册表编辑和使用的工具,如URLScan以在IIS中正确设置它的文章。 我跟着它在我们的服务器上,并且它的工作原理: http://blogs.msdn.com/b/varunm/archive/2013/04/23/remove-unwanted-http-response-headers.aspx 。 如果您只使用UrlScan的,但不做更改注册表,在您停止万维网发布服务的时候,你的服务器将返回从Http.sys文件服务器的HTTP响应。 此外,这里使用URLScan工具的共同pitfals: http://msdn.microsoft.com/en-us/library/ff648552.aspx#ht_urlscan_008
在IIS 10,我们使用了类似的解决方案,德鲁的做法,即:
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");
}
}
}
很显然添加引用在您的项目(s)表示,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在内)受到影响;
我尝试了所有的东西在这里和其他几个类似的堆栈溢出线程。
我被搁置下来一点,因为我忘了做配置更改后清除浏览器缓存。 如果你不这样做,该文件是在本地缓存,它将有助于它回到你原来的报头(杜)。
我得到了它主要是通过除去 runAllManagedModulesForAllRequests工作:
<modules runAllManagedModulesForAllRequests="true">
这样取出多余的头从大部分的静态文件,但我仍然是越来越对在招摇我的WebAPI项目的一些静态文件的“服务器”头。
我终于找到并应用该解决方案,现在所有不需要的头都不见了:
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头,不只是空出的价值。 默认情况下,它会删除:
我研究过这个和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"