欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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安装路径)
IIS下网站对options请求直接返回404

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>