我有兩個單獨的應用程序,一個燼應用程序和一個軌道應用程序在同一臺服務器上。現在,我正在本地進行測試。Ember應用程序請求Rails應用程序 - 跨域?
我的Ember請求不會出去(本地主機:3000)。我似乎無法弄清楚是否發生這種情況,因爲它認爲這是一個跨域請求。即使它們在同一臺服務器上,它是否會被視爲跨域請求?如果是這樣,是否有避免這種跨域請求,因爲他們在同一臺服務器上,而不會影響安全性?還是我需要堅持JSONP?
我有兩個單獨的應用程序,一個燼應用程序和一個軌道應用程序在同一臺服務器上。現在,我正在本地進行測試。Ember應用程序請求Rails應用程序 - 跨域?
我的Ember請求不會出去(本地主機:3000)。我似乎無法弄清楚是否發生這種情況,因爲它認爲這是一個跨域請求。即使它們在同一臺服務器上,它是否會被視爲跨域請求?如果是這樣,是否有避免這種跨域請求,因爲他們在同一臺服務器上,而不會影響安全性?還是我需要堅持JSONP?
是的,對不同端口的請求是跨域請求。瀏覽器正在做一個預檢選項請求(CORS),但沒有得到答案。然後刪除原始請求。您需要讓服務器使用適當的CORS頭部響應此OPTIONS請求。瀏覽器會發出原始請求。
這裏是我的應用程序控制器代碼:
class V1::ApplicationController < ApplicationController
after_filter :cors_set_access_control_headers, :log_user
# respond to options requests with blank text/plain as per spec
def cors_preflight_check
logger.info ">>> responding to CORS request"
render :text => '', :content_type => 'text/plain'
end
# For all responses in this controller, return the CORS access control headers.
def cors_set_access_control_headers
headers['Access-Control-Allow-Origin'] = '*'
headers['Access-Control-Allow-Headers'] = 'X-AUTH-TOKEN, X-API-VERSION, X-Requested-With, Content-Type, Accept, Origin'
headers['Access-Control-Allow-Methods'] = 'POST, GET, PUT, DELETE, OPTIONS'
headers['Access-Control-Max-Age'] = "1728000"
end
而且從路線。RB:
match '/*path' => 'application#cors_preflight_check', :via => :options
還有一個機架插件,可以處理這個問題:rack-cors
你不說你正在運行什麼平臺上,但這種事情伊夫找到最好的解決辦法是帶
https://github.com/metajack/tape
這將允許您設置了一個小反向代理 - 和將地址映射到您的Rails應用程序,同時爲您的JS服務。
不同的端口,被安全沙箱視爲不同的域,因此如果您單獨提供您的餘燼和導軌,您將需要一個反向代理。
我的本地環境是OS X,但我會在Linux上部署。我會看看那個。回答你的問題,每個應用程序單獨服務。 – darksky
我猜你有幾個選項取決於如果您的應用在開發或生產模式下運行,這是:
發展模式只有
chrome
或chromium
作爲你的開發瀏覽器,你可以開始它的國旗--args --disable-web-security
開發與生產模式
jsonp
因爲你已經提到Access-Control-Allow-Origin: *
,因爲你正在使用的軌道看看here。http://myhost.com/app1
,http://myhost.com/app2
等希望它可以幫助上variing。
我使用'rack-cors',但是當運行一個請求時,我的rails服務器沒有顯示任何東西。跨域請求是否顯示在Rails服務器上,然後被拒絕,還是AJAX在發送之前拒絕它們? – darksky
如果'AJAX'在發送之前阻止跨域請求,'cors'有什麼意義? – darksky
AJAX總是發送飛行前OPTIONS請求以進行跨域請求。一些瀏覽器調試工具不顯示這個。我無法讓rak-cors工作,所以我實現了處理自己的OPTIONS請求。 – buuda