Answers:
将此添加到您的global.asax.cs中:
protected void Application_PreSendRequestHeaders()
{
Response.Headers.Remove("Server");
Response.Headers.Remove("X-AspNet-Version");
Response.Headers.Remove("X-AspNetMvc-Version");
}
NullReferenceException
如果您依靠,可能会在Cassini中找到一个HttpContext.Current
。这篇博客文章显示了如何做到这一点,同时又避免了对Cassini的支持(如果这对您很重要)。
PreSendRequestHeaders
在实现IHttpModule
或的类中使用in 并不是一个好主意Global.asax
。我目睹了在压力负荷下冻结服务器上的应用程序的事件。该BeginRequest
事件应该可以使响应头更改。参见hanselman.com/blog/ChecklistWhatNOTToDoInASPNET.aspx。
在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>
HttpApplication
,the HttpRequest
,the HttpContext
和the HttpResponse
are不是null
,并检查HttpRequest.IsLocal
is false
。
与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>
rewrite
节点下system.webServer
。请注意,如果服务器上未安装UrlRewrite,这将使您的站点崩溃。而且,您最好首先使用IIS配置控制台来检查它如何记下那些配置节点。
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-Version
和X-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-By
web.config中的自定义标头。
<system.webServer>
...
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
...
</system.webServer>
请注意,如果您具有ARR(应用程序请求路由),它还将添加自己的X-Powered-By
,不会被自定义标头设置删除。必须通过IIS根目录(而不是站点)上的IIS管理器和编辑器配置删除此目录:转到system.webServer/proxy
节点并设置arrResponseHeader
为false
。之后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中生成的隐藏输入)。
实际上,上面显示的编码模块和Global.asax示例仅适用于有效请求。
例如,在URL末尾添加<,您将获得一个“错误请求”页面,该页面仍显示服务器标头。许多开发人员忽略了这一点。
显示的注册表设置也不起作用。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>
X-AspNet-Version
和X-AspNetMvc-Version
标头的情况。我所知道的是这种方式并不总是有效(如果可行的话)。有关删除它们的更可靠方法,请参见@Frederic答案。
此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。
除了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>
要删除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即可禁用这些标头的最佳方法。
如果只想删除标题,则可以使用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\DisableServerHeader
注册表项设置为REG_DWORD
的1
。
OnPreSendRequestHeaders
出于某种原因,我的事件处理程序(参见上文)从不触发。
跟进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但不进行注册表更改,则在停止World Wide Publishing服务期间,您的服务器将从HTTP.sys文件返回服务器http响应。另外,以下是使用UrlScan工具的常见提示:http : //msdn.microsoft.com/zh-cn/library/ff648552.aspx#ht_urlscan_008
在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);
我已经对此进行了研究,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"
您可以在Global.asax.cs文件中添加以下代码
protected void Application_PreSendRequestHeaders()
{
Response.Headers.Remove("Server");
}
上面提出的解决方案结合以下方面为我工作。我在这里发布我的方案和解决方案。
对我来说,我想删除以下标头:
我将这些添加到了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>
希望能帮助到你!
我在这里和其他几个类似的堆栈溢出线程上尝试了所有东西。
我挂了一下电话,因为我在进行配置更改后忘记清除浏览器缓存。如果您不这样做,并且文件在本地缓存中,它将使用原始标头(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标头,而不仅是删除值。默认情况下,它删除: