A. Nginx的反向代理跨域
什麼是跨域?
跨域是指a頁面想獲取b頁面資源,如果a、b頁面的協議、域名、埠、子域名不同,或是a頁面為ip地址, b頁面為域名地址,所進行的訪問行動都是跨域
瀏覽器為了安全問題一般都限制了跨域訪問,也就是不允許跨域請求資源
同ip(或domain),同埠,同協議視為同一個域,一個域內的腳本僅僅具有本域內的許可權,可以理解為本域腳本只能讀寫 本域內的資源,而無法訪問其它域的資源。這種安全限制稱為同源策略
現代瀏覽器在安全性和可用性之間選擇了一個平衡點。 在遵循同源策略的基礎上,選擇性地為同源策略「開放了後門」。例如img script style等標簽,都允許垮域引用資源,然而, 你也只能是引用這些資源而已,並不能讀取這些資源的內容
同源策略限制以下幾種行為:
1.Cookie、LocalStorage 和 IndexDB 無法讀取
2.DOM 和 Js對象無法獲得
3.AJAX 請求不能發送
http://www.domain.com/a.jshttp://www.domain.com/b.js 同一域名,不同文件或路徑 允許http://www.domain.com/lab/c.jshttp://www.domain.com:8000/a.jshttp://www.domain.com/b.js 同一域名,不同埠 不允許http://www.domain.com/a.jshttps://www.domain.com/b.js 同一域名,不同協議 不允許http://www.domain.com/a.jshttp://192.168.4.12/b.js 域名和域名對應相同ip 不允許http://www.domain.com/a.jshttp://x.domain.com/b.js 主域相同,子域不同 不允許http://domain.com/c.jshttp://www.domain1.com/a.jshttp://www.domain2.com/b.js 不同域名 不允許
1、 通過jsonp跨域
2、 document.domain + iframe跨域
3、 location.hash + iframe
4、 window.name + iframe跨域
5、 postMessage跨域
6、 跨域資源共享(CORS)
7、 nginx代理跨域
8、 nodejs中間件代理跨域
9、 WebSocket協議跨域
正向代理 :代理位於網站和客戶端中間, 客戶端無法訪問某網站,就將請求發送給代理伺服器,代理從網站取回來再發送給客戶端,網站並不知道為誰提供服務
反向代理 :客戶端訪問某網站的一個頁面, 但是網站並沒有,就偷偷從另外一台伺服器上取回來,然後作為自己的內容吐給用戶,用戶不知道真正提供服務的是誰
對於瀏覽器來說,訪問的就是同源伺服器上的一個url。而nginx通過 檢測url前綴,把http請求轉發到後面真實的物理伺服器。並通過rewrite命令把前綴再去掉。這樣真實的伺服器就可以正確 處理請求,並且並不知道這個請求是來自代理伺服器的。
簡單說,nginx伺服器欺騙了瀏覽器,讓它認為這是同源調用,從而解決了瀏覽器的跨域問題。又通過重寫url,欺騙了真實 的伺服器,讓它以為這個http請求是直接來自與用戶瀏覽器的。
Location/carrots-admin-ajax/{
proxy_passhttp://dev.admin.carrots.ptteng.com/;
}
proxy_pass 把請求代理到其他主機
兩種寫法hhttp://dev.admin.carrots.ptteng.com/ 和 http://dev.admin.carrots.ptteng.com
如果訪問url = http://server/html/test.jsp ,則被nginx代理後
情況1,將test/作為根路徑,請求test/路徑下的資源。
情況2,則被nginx代理後,請求路徑會變為http://proxy_pass/test.jsp,直接訪問server的根資源。
是一個匹配規則,用於攔截請求,匹配任何以/proxy/html/開頭的地址,匹配符合以後,停止往下搜索正則。
對於瀏覽器來說,訪問的就是同源伺服器上的一個url。而nginx通過檢測url前綴,把http請求轉發到後面真實的物理伺服器。並通過rewrite命令把前綴再去掉。這樣真實的伺服器就可以正確處理請求,並且並不知道這個請求是來自代理伺服器的。
簡單說,nginx伺服器欺騙了瀏覽器,讓它認為這是同源調用,從而解決了瀏覽器的跨域問題。又通過重寫url,欺騙了真實的伺服器,讓它以為這個http請求是直接來自與用戶瀏覽器的。
1.執行server塊的rewrite指令(這里的塊指的是server關鍵字後{}包圍的區域,其它xx塊類似)
2.執行location匹配
3.執行選定的location中的rewrite指令
如果其中某步URI被重寫,則重新循環執行1-3,直到找到真實存在的文件
如果循環超過10次,則返回500 Internal Server Error錯誤
7.參考文獻
參考一: https://www.cnblogs.com/gabrielchen/p/5066120.html
參考二: http://blog.csdn.net/shendl/article/details/48443299
8.更多討論
提問:
Q :例如img script style等標簽,都允許垮域引用資源?
A :在瀏覽器中,並且載入的方式其實相當於一次普通的GET請求,唯一不同的是,為了安全起見,瀏覽器不允許這種方式下對載入到的資源的讀寫操作,而只能使用標簽本身應當具備的能力(比如腳本執行、樣式應用等等)。
Q :例如img script style等標簽,都允許垮域引用資源?
A :在瀏覽器中,並且載入的方式其實相當於一次普通的GET請求,唯一不同的是,為了安全起見,瀏覽器不允許這種方式下對載入到的資源的讀寫操作,而只能使用標簽本身應當具備的能力(比如腳本執行、樣式應用等等)。
Q:JSONP和nginx跨域有什麼不同
JSONP和nginx是完全不同的 是可以跨域的,而且在跨域腳本中可以直接回調當前腳本的函數
原理:是可以跨域的,而且在跨域腳本中可以直接回調當前腳本的函數
script標簽是可以載入異域的JavaScript並執行的,通過預先設定好的callback函數來實現和母頁面的交互。它有一個大名,叫做JSONP跨域,JSONP是JSON with Padding的略稱。它是一個非官方的協議,明明是載入script,為啥和JSON扯上關系呢?原來就是這個callback函數,對它的使用有一個典型的方式,就是通過JSON來傳參,即將JSON數據填充進回調函數,這就是JSONP的JSON+Padding的含義。JSONP只支持GET請求。
B. Nginx反向代理的使用及原理
正向代理,用通俗的方式來說,就是代理伺服器只起到轉發的作用,例如,在顧客進商店購買東西,商店就是一個正向代理,起到的作用就是把商品從廠家代理售賣到顧客手中。
反向代理,就是顧客的請求是確定的,但將商品的需求信息發送給代理商之後,代理商通過各種方式尋找不同的供貨商,再把供貨商提供的商品轉交給顧客。顧客是不知道代理商背後的供貨商是誰的。這種方式有點類似於目前的「三隻松鼠」等網路直銷平台的邏輯,顧客發送芒果乾的請求給三隻松鼠,三隻松鼠從全國進行供貨商的選擇,拿到貨品後再打上三隻松鼠的logo轉交給顧客,實現反向的代理,代理的是供貨商,顧客不知道具體的供應商是誰(所以才會要求包裝上需要印上供應商的名稱和地址,要不然出問題都不知道找誰。)
Nginx的安裝網路有很多資源,包括Linux和Windows的,在此不表。主要關注一下如何進行配置,來看看 nginx.conf.default 中的配置信息:
可以看到,主要的幾個配置模塊:
下面主要講講經常使用的server以及location的配置。
gzip壓縮中
對於阿里雲上的配置,我們直接使用一級域名 abc.com 解析阿里雲伺服器的IP地址: