有趣的问题。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。