IIS下網站對options請求直接返回404


什么是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安裝路徑)
image

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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM