摘要:給服務器配置后,表示服務器可以接受所有的請求源即接受所有跨域的請求。三預檢請求其實上面的配置涉及到了一個標準全稱是跨域資源共享,它的提出就是為了解決跨域請求的。服務器確認允許之后,才發(fā)起實際的請求。
當出現(xiàn)403跨域錯誤的時候 No "Access-Control-Allow-Origin" header is present on the requested resource,需要給Nginx服務器配置響應的header參數(shù):
一、 解決方案只需要在Nginx的配置文件中配置以下參數(shù):
location / { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods "GET, POST, OPTIONS"; add_header Access-Control-Allow-Headers "DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization"; if ($request_method = "OPTIONS") { return 204; } }
上面配置代碼即可解決問題了,不想深入研究的,看到這里就可以啦=-=二、 解釋 1. Access-Control-Allow-Origin
服務器默認是不被允許跨域的。給Nginx服務器配置`Access-Control-Allow-Origin *`后,表示服務器可以接受所有的請求源(Origin),即接受所有跨域的請求。2. Access-Control-Allow-Headers 是為了防止出現(xiàn)以下錯誤:
Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.
這個錯誤表示當前請求Content-Type的值不被支持。其實是我們發(fā)起了"application/json"的類型請求導致的。這里涉及到一個概念:預檢請求(preflight request),請看下面"預檢請求"的介紹。
3. Access-Control-Allow-Methods 是為了防止出現(xiàn)以下錯誤:Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.
4.給OPTIONS 添加 204的返回,是為了處理在發(fā)送POST請求時Nginx依然拒絕訪問的錯誤發(fā)送"預檢請求"時,需要用到方法 OPTIONS ,所以服務器需要允許該方法。
三、 預檢請求(preflight request)其實上面的配置涉及到了一個W3C標準:CROS,全稱是跨域資源共享 (Cross-origin resource sharing),它的提出就是為了解決跨域請求的。
跨域資源共享(CORS)標準新增了一組 HTTP 首部字段,允許服務器聲明哪些源站有權限訪問哪些資源。另外,規(guī)范要求,對那些可能對服務器數(shù)據(jù)產生副作用的HTTP 請求方法(特別是 GET 以外的 HTTP 請求,或者搭配某些 MIME 類型的 POST 請求),瀏覽器必須首先使用 OPTIONS 方法發(fā)起一個預檢請求(preflight request),從而獲知服務端是否允許該跨域請求。服務器確認允許之后,才發(fā)起實際的 HTTP 請求。在預檢請求的返回中,服務器端也可以通知客戶端,是否需要攜帶身份憑證(包括 Cookies 和 HTTP 認證相關數(shù)據(jù))。
其實Content-Type字段的類型為application/json的請求就是上面所說的搭配某些 MIME 類型的 POST 請求,CORS規(guī)定,Content-Type不屬于以下MIME類型的,都屬于預檢請求:
application/x-www-form-urlencoded multipart/form-data text/plain
所以 application/json的請求 會在正式通信之前,增加一次"預檢"請求,這次"預檢"請求會帶上頭部信息 Access-Control-Request-Headers: Content-Type:
OPTIONS /api/test HTTP/1.1 Origin: http://foo.example Access-Control-Request-Method: POST Access-Control-Request-Headers: Content-Type ... 省略了一些
服務器回應時,返回的頭部信息如果不包含Access-Control-Allow-Headers: Content-Type則表示不接受非默認的的Content-Type。即出現(xiàn)以下錯誤:
Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.
參考文章:
阮一峰【跨域資源共享 CORS 詳解】
MDN web docs【HTTP訪問控制(CORS)】
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/39740.html
摘要:目前,所有瀏覽器都支持該功能,瀏覽器不能低于。因此,實現(xiàn)通信的關鍵是服務器。如果指定的域名在許可范圍內,服務器返回的響應,會多出頭信息字段也可能多出其他可選字段或者是表示接受任意域名的請求。 實際跨域問題及其解決方案 1.課題:ajax實現(xiàn)跨域訪問 2.背景: 1.畫面服務器:192.168.196.6 → tomcat服務2.js模板服務器:192.168.196.8 → ngi...
摘要:場景我們的資源來自網絡的四面八方,所以難免需要用上跨域,業(yè)界也有非常多跨域的解決方案,這次我是來說說跨域與狀態(tài)碼之間的一個問題。 場景 我們的資源來自網絡的四面八方,所以難免需要用上跨域,業(yè)界也有非常多跨域的解決方案,這次我是來說說跨域與狀態(tài)碼之間的一個問題。 問題 當我們的 URL 地址返回的狀態(tài)碼是 400、403、404、500 的時候,跨域的資源是不會跟隨返回的,也就是說,即便...
摘要:瀏覽器一般默認會禁止跨域訪問。因為不安全,容易出現(xiàn)跨站請求偽造攻擊。二控制瀏覽器允許跨域訪問通過添加等頭信息的方式控制瀏覽器緩存。 一、什么是跨域 跨域是指從一個域名的網頁去請求另一個域名的資源。比如從 www.a.com 頁面去請求 www.b.com 的資源。 showImg(https://segmentfault.com/img/remote/1460000015873212?...
閱讀 2008·2019-08-29 16:27
閱讀 1377·2019-08-29 16:14
閱讀 3380·2019-08-29 14:18
閱讀 3461·2019-08-29 13:56
閱讀 1260·2019-08-29 11:13
閱讀 2128·2019-08-28 18:19
閱讀 3447·2019-08-27 10:57
閱讀 2283·2019-08-26 11:39