文章來源:http://to-u.xyz/2016/06/30/nginx-cors/
背景描述
最近在研究RESTful API
接口設計,使用的是Nginx
,
要實現本地http://127.0.0.1
跨域訪問服務器端http://api.zlzkj.com
,
並且要支持DELETE
PUT
等請求。
跨域配置
只需要在Nginx
配置文件里加入以下配置,即可開啟跨域
add_header Access-Control-Allow-Origin *;
*代表任何域都可以訪問,可以改成只允許某個域訪問,如Access-Control-Allow-Origin: http://www.zlzkj.com
。
這樣的配置雖然開啟了跨域請求,但只支持GET
HEAD
POST
OPTIONS
請求,使用DELETE
發起跨域請求時,瀏覽器出於安全考慮會先發起OPTIONS請求,服務器端接收到的請求方式就變成了OPTIONS,所以引起了服務器的405 Method Not Allowed。
所以要對OPTIONS請求進行處理
if ($request_method = 'OPTIONS') { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS; #其他頭部信息配置,省略... return 204; }
當請求方式為OPTIONS
時,設置Allow
的響應頭,重新處理這次請求。
配置好並重啟Nginx
,刷新頁面重新發起請求,在控制台里你會發現,出現了二次請求,
第一次是OPTIONS
請求,第二次才是DELETE
請求,這就是對OPTIONS
請求進行處理的結果,到這里總算完成了一次DELETE
跨域請求了。
完整配置參考
add_header Access-Control-Allow-Origin *; location / { if ($request_method = 'OPTIONS') { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS; return 204; } index index.php; try_files $uri @rewriteapp; }
放到配置文件的server {}
里
參考文章
http://www.rails365.net/articles/cong-kua-yu-dao-cors-yi
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS
https://segmentfault.com/q/1010000005837213