IIS站臺對Options請求直接返回404

SignalR的問題

之前在做SignalR的時候,需要對不同的子網域做API的呼叫,JS是在 signalr.domain.com ,需要呼叫的是在 o.domain.com 開始使用連線時,會引發CORS問題,如下圖:

錯誤 

CorsPreflightError.png

SignalR在做options時,會用 https://signalr.domain.com/negotiate?negotiateVersion=1 這樣的路徑做預檢,不過查了老半天都是回404,檢查原因有可能如下:

WebConfig是否被移除options請求的處理

<system.webServer>
  <handlers>
    <remove name="OPTIONSVerbHandler" />
  </handlers>
</system.webServer>

檢查IIS是否安裝了 UrlScan的東西,若安裝了請檢查AllowVerbs中是否包含了options

UrlScan的配置文件為UrlScan.ini (C:\Windows\System32\inetsrv\urlscan\UrlScan.ini) 將OPTIONS從[DenyVerbs]中移除並添加到[AllowVerbs]下

ISAPI篩選器的UrlScan.png
UrlScan的設定.png

在站臺的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>
參考資料:
IIS下网站对options请求直接返回404 - 傅小灰 - 博客园
什么是options请求 options请求为发送非简单跨域请求前的预检请求,若该请求未正常返回,浏览器会阻止后续的请求发送。 一般情况下,有三种方式会导致浏览器发起预检请求 1.请求的方法不是GET/HEAD/POST 2.POST请求的Content Type并非application/x ww
[Day 27] Cross-Origin Resource Sharing (CORS) - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
概覽 考量到安全問題,瀏覽器會以同源政策(Same-origin policy) 限制網頁對其他 Origin 的資源(Resource)存取,例如 AJAX、DOM、Cookie、圖片等等,然而透過…
Author image
關於 Richard Zheng
您已成功訂閱 Richard's NoteBook
歡迎回來!您已成功登入。
無法讓您登入。請再試一次。