<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
同源(域名、協定、埠相同)策略是一種約定,是瀏覽器最核心也是最基本的安全功能,如果缺少了同源策略,瀏覽器的正常功能將受到影響。
跨域就是跨域名,跨埠,跨協定(非同源策略)。
簡單說,跨域分為 簡單跨域 和 複雜跨域。
簡單跨域:不會傳送OPTIONS請求。
複雜跨域:會傳送一個預檢查OPTIONS請求。
複雜跨域的條件是:
①、非GET、HEAD、POST請求。
②、POST請求的Content-Type不是application/x-www-form-urlencoded, multipart/form-data, 或text/plain。
③、新增了自定義header,例如Token。
跨域請求瀏覽器會在Headers中新增Origin,通常情況下不允許使用者修改其值。
跨域是前後端分離開發中非常常見的問題。無論用什麼程式語言,現在都已經很難離開Nginx。因此直接在Nginx中處理跨域問題有得天獨厚的優勢。當出現跨域問題的時候,只需要給Nginx伺服器設定響應的header引數即可。
只需要在Nginx的組態檔中設定以下引數:
location / { add_header Access-Control-Allow-Origin *; add_header 'Access-Control-Allow-Credentials''true'; # 是否允許後續請求攜帶cookies,該值只能是true,否則不返回。如果上面的Access-Control-Allow-Origin設定的是* 而你又需要cookie資訊,則 必須設定這行。 add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; add_header Access-Control-Allow-Headers *; if($request_method = 'OPTIONS') { return204; } }
上面的設定程式碼即可解決跨域問題了,不想深入研究的,看到這裡就可以了=-=
伺服器預設是不被允許跨域的。給Nginx設定Access-Control-Allow-Origin * 後,表示伺服器可以接受所有的請求源(Origin),即接受所有跨域的請求。也就是說,表示接受任意域名的請求。上面我們這裡設定的是* 這是最簡單粗暴的方式,但是伺服器出於安全考慮,肯定不會這麼幹,而且,如果是*的話,遊覽器將不會傳送cookies資料(如果需要攜帶cookies資料,則需要設定 'Access-Control-Allow-Credentials:true')。
所以Access-Control-Allow-Origin一般都是設定為 指定域(也就是指定 某一個url來請求我伺服器)的方式。指定域 設定的方式如下:
add_header Access-Control-Allow-Origin 'www.test.com'; 注意:只能指定一個域
Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.
這個錯誤表示當前請求Content-Type的值不被支援。其實是我們發起了"application/json"的型別請求導致的。這裡涉及到一個概念:預檢請求(preflight request)。請看下面"預檢請求"的介紹。
Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.
傳送"預檢請求"時,需要用到方法OPTIONS,所以伺服器需要允許該方法。
其實上面的設定涉及到了一個W3C標準:CROS,全稱是跨域資源共用 (Cross-origin resource sharing),它的提出就是為了解決跨域請求的。
跨域資源共用(CORS)標準新增了一組HTTP 首部欄位,允許伺服器宣告哪些源站有許可權存取哪些資源。另外,規範要求,對那些可能對伺服器資料產生副作用的HTTP 請求方法(特別是 GET 以外的 HTTP 請求,或者搭配某些 MIME 型別的 POST 請求),瀏覽器必須首先使用 OPTIONS 方法發起一個預檢請求(preflight request),從而獲知伺服器端是否允許該跨域請求。伺服器確認允許之後,才發起實際的 HTTP 請求。在預檢請求的返回中,伺服器端也可以通知使用者端,是否需要攜帶身份憑證(包括 Cookies 和 HTTP 認證相關資料)。
其實Content-Type欄位的型別為application/json的請求 就是上面所說的搭配某些 MIME 型別的 POST 請求,CORS規定,Content-Type不屬於以下MIME型別的,都屬於預檢請求:
application``/x-www-form-urlencoded``multipart``/form-data``text``/plain
POST請求中的Content-Type不是上面這三種的其中一種的話,都屬於預檢請求。(上面也有提到過,就是 複雜跨域的條件中的第②步)
所以 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。
即出現以下錯誤:
Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.
解決跨域的解決方案有很多種,最常見也是最傳統的解決方式是使用JSONP的方式。CORS與JSONP的使用目的相同,但是比JSONP更強大。
JSONP只支援GET請求,CORS支援所有型別的HTTP請求。JSONP的優勢在於支援老式瀏覽器,以及可以向不支援CORS的網站請求資料。
到此這篇關於如何使用Nginx解決跨域問題的文章就介紹到這了,更多相關Nginx解決跨域內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45