傳送 options 請求 後端返回 405 的解決過程

WilliamQian發表於2020-04-09

碰到的問題

因為專案是前後端安全分離的,前端和api用的不同的域名,ajax請求需要跨域,所以使用了laravel-cors這個庫。配置完後,所有介面都能正常跨域,直到我寫了個首頁的介面,例如api域名為api.site.com,首頁介面地址為:api.site.com/。因為瀏覽器跨域時,會先傳送一個method為options的preflight request(預檢請求),其他非首頁的介面的預檢請求都能正常返回,唯獨這個首頁介面的預檢請求一直返回405。

解決過程

一開始以為是laravel-cors的配置問題,但是我本地測試是沒問題,測試伺服器才有這個問題,懷疑是伺服器的nginx搗的鬼,查了一下,對於靜態檔案請求,nginx只支援get,而options、post等都會返回 405。這下恍然大悟,其他介面都沒問題,因為請求都被重定向到index.php,是動態檔案,所以允許options請求。而首頁沒有被重定向的index.php。問題就出在下面這個配置,當我請求api.site.com/的時候,匹配到了$uri/,nginx把他當成靜態檔案目錄,自然就不允許options請求了,

location / {
     try_files $uri $uri/ /index.php?$query_string;
}

解決方法就是去掉$uri/,變成下面這樣,首頁的介面請求就會重定向到index.php了,nginx知道它是動態請求,就會支援options請求了

location / {
     try_files $uri /index.php?$query_string;
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章