IIS下网站对options请求直接返回404
程序员文章站
2022-06-04 10:45:47
什么是options请求 options请求为发送非简单跨域请求前的预检请求,若该请求未正常返回,浏览器会阻止后续的请求发送。 一般情况下,有三种方式会导致浏览器发起预检请求 1.请求的方法不是GET/HEAD/POST 2.POST请求的Content Type并非application/x ww ......
什么是options请求
options请求为发送非简单跨域请求前的预检请求,若该请求未正常返回,浏览器会阻止后续的请求发送。
一般情况下,有三种方式会导致浏览器发起预检请求
1.请求的方法不是get/head/post
2.post请求的content-type并非application/x-www-form-urlencoded, multipart/form-data 或 text/plain
3.请求中设置了自定义的header字段(如token)
浏览器发出请求但直接返回404
若未对iis进行配置,则会导致options请求被iis直接响应返回,而不会进入到代码中。这也是global中的application_beginrequest无法捕获到options请求的原因。1.检查webconfig中的配置,是否移除了对options请求的特殊处理
可在iis中进行配置:[网站]-[应用程序]-[处理程序映射]
<system.webserver> <handlers> <remove name="optionsverbhandler" /> </handlers> </system.webserver>
2.检查iis服务器是否安装了urlscan,若安装了请检查allowverbs中是否包含了options
可在iis中查看是否安装了urlscan [网站]-[isapi筛选器] (可以找到urlscan安装路径)
urlscan的配置文件为urlscan.ini (c:\windows\system32\inetsrv\urlscan\urlscan.ini)
将options从[denyverbs]中移除并添加到[allowverbs]下
3.在global的application_beginrequest实践中直接响应options请求
//允许所有的options请求,直接返回200状态码 private void application_beginrequest(object sender, eventargs e) { if (httpcontext.current.request.httpmethod == "options") { httpcontext.current.response.statuscode = 200; httpcontext.current.response.headers["access-control-allow-origin"] = httpcontext.current.request.headers["origin"]; httpcontext.current.response.end(); } }
4.在webconfig中的allow-method中添加上options
<system.webserver> <httpprotocol> <customheaders> <add name="access-control-allow-methods" value="options,post,get" /> <add name="access-control-allow-headers" value="x-requested-with,aspxauth" /> <add name="access-control-allow-credentials" value="true" /> </customheaders> </httpprotocol> </system.webserver>