2016-04-27 56 views
2

問題是: 爲什麼我可以從瀏覽器/郵遞員/甚至Node.js(http.get方法)創建REST API請求,但不是來自Angular的資源?爲什麼我可以從瀏覽器中創建REST API請求,但不能從Angular的資源中創建?

錯誤消息的片段是:

XMLHttpRequest cannot load http://example-of-external-api-site.com 
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://localhost' is therefore not allowed access. 

之前問這個問題,我嘗試看看CORS的定義。根據我的理解,我可以理解爲什麼它不允許我從Angular的資源中提出的請求,因爲它來自不同的域。但是,我的瀏覽器/郵遞員/ Node.js應用程序是不是來自不同的域?

請幫我回答這個問題,我真的不能明白爲什麼..

回答

2

當一個請求從瀏覽器直接訪問某個網址時所做,你請求的URL的內容,而無需使用XMLHttpRequest

有兩種情況$http.get()

當訪問一個URI,不承載你的AngularJS內容相同的域,通過在瀏覽器中呈現的內容中使用XMLHttpRequest Ajax調用,您必須提供與目標服務器上的白名單匹配的COR標頭。這是由於瀏覽器安全限制,以防止惡意的惡意攻擊,如跨站點腳本。

當訪問與託管AngularJS內容的域相同的域(通常通過相對路徑:/Api/1而不是http://domain.com/api/1)時,不需要COR白名單,因爲源域和目標域都是相同。

最後,當從節點調用url時,您正在向服務器併發調用發送服務器,因爲它沒有在瀏覽器中執行,所以它沒有相同的安全限制。

+0

你能改述這段文字嗎?當通過$ http.get()訪問一個uri時,你通過在瀏覽器的呈現內容中利用XMLHttpRequest的ajax調用來請求來自除託管AngularJS內容的域之外的資源。當您這樣做時,您必須提供一個CORs標頭,該標頭與服務器上的白名單相匹配,並符合每個瀏覽器的安全限制。我在做一個假設,當我做$ http.get時,我正在從託管我的AngularJS內容的域請求資源。 – kelvien

+0

根據您發佈的錯誤消息,您的假設不正確。您正在通過「XMLHttpRequest」在'http:// example-of-external-api-site.com'上請求資源,因此是CORs問題。如果您始終通過相對路徑請求,則只能確保從託管您的內容的相同域請求資源。 –

+0

我通過XMLHttpRequest從我的域請求資源到'example-of-external-api-site.com'來理解CORS問題是如何存在的。我想澄清的是,除了託管您的AngularJS內容以外的其他域名的措辭' – kelvien

相關問題