有趣的问题。response headers从IIS 删除的所有方法似乎不适用于Allow和Public标头,OPTIONS请求始终返回:
Allow: OPTIONS, TRACE, GET, HEAD, POST
Public: OPTIONS, TRACE, GET, HEAD, POST
无论服务器实际允许什么。
IIS中的所有请求都由模块处理,OPTIONS请求由来处理,ProtocolSupportModule这不是必需的,而且看起来很愚蠢。
如果我们删除该模块,则服务器不再响应您仍然希望支持的“选项”请求,因此我们必须使用另一个模块来回答这些问题。
打开:
%SystemRoot%\System32\inetsrv\config\applicationHost.config
并搜索OPTIONSVerbHandler该行的注释,同时在该行上面的(TRACEVerbHandler)也是如此。现在添加一个新节点:
<add name="MyOPTIONSVerbHandler" path="*" verb="OPTIONS" modules="StaticFileModule" requireAccess="None" />
整个块应如下所示:
<!-- <add name="TRACEVerbHandler" path="*" verb="TRACE" modules="ProtocolSupportModule" requireAccess="None" />
<add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="ProtocolSupportModule" requireAccess="None" /> -->
<add name="MyOPTIONSVerbHandler" path="*" verb="OPTIONS" modules="StaticFileModule" requireAccess="None" />
现在,staticFileModule将处理OPTIONS请求,但不会返回任何内容。
如果现在OPTIONS向服务器发出请求,则不会获得Allow也不提供Public标头,可以在web.config中轻松添加它们
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Allow" value="GET,POST,HEAD" />
<add name="Public" value="GET,POST,HEAD" />
</customHeaders>
</httpProtocol>
</system.webServer>
现在您的OPTIONS请求可以按要求工作,但是那些额外的标头也会与任何GET或POST我认为仍然有效的http请求一起发送。
如果只想将这些标头用于OPTIONS请求,则可以编写一个简单的http模块来设置这些标头并使用它,而不是上面使用的StaticFileModule。