2013-06-25 57 views
6

我有兩個單獨的應用程序,一個燼應用程序和一個軌道應用程序在同一臺服務器上。現在,我正在本地進行測試。Ember應用程序請求Rails應用程序 - 跨域?

我的Ember請求不會出去(本地主機:3000)。我似乎無法弄清楚是否發生這種情況,因爲它認爲這是一個跨域請求。即使它們在同一臺服務器上,它是否會被視爲跨域請求?如果是這樣,是否有避免這種跨域請求,因爲他們在同一臺服務器上,而不會影響安全性?還是我需要堅持JSONP?

回答

7

是的,對不同端口的請求是跨域請求。瀏覽器正在做一個預檢選項請求(CORS),但沒有得到答案。然後刪除原始請求。您需要讓服務器使用適當的CORS頭部響應此OPTIONS請求。瀏覽器會發出原始請求。

這裏是more information on CORS

這裏是我的應用程序控制器代碼:

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

+1

我使用'rack-cors',但是當運行一個請求時,我的rails服務器沒有顯示任何東西。跨域請求是否顯示在Rails服務器上,然後被拒絕,還是AJAX在發送之前拒絕它們? – darksky

+0

如果'AJAX'在發送之前阻止跨域請求,'cors'有什麼意義? – darksky

+0

AJAX總是發送飛行前OPTIONS請求以進行跨域請求。一些瀏覽器調試工具不顯示這個。我無法讓rak-cors工作,所以我實現了處理自己的OPTIONS請求。 – buuda

0

你不說你正在運行什麼平臺上,但這種事情伊夫找到最好的解決辦法是帶

https://github.com/metajack/tape

這將允許您設置了一個小反向代理 - 和將地址映射到您的Rails應用程序,同時爲您的JS服務。

不同的端口,被安全沙箱視爲不同的域,因此如果您單獨提供您的餘燼和導軌,您將需要一個反向代理。

+0

我的本地環境是OS X,但我會在Linux上部署。我會看看那個。回答你的問題,每個應用程序單獨服務。 – darksky

0

我猜你有幾個選項取決於如果您的應用在開發或生產模式下運行,這是:

發展模式只有

  • 如果您正在使用chromechromium作爲你的開發瀏覽器,你可以開始它的國旗--args --disable-web-security

開發與生產模式

  • 使用jsonp因爲你已經提到
  • 添加到您的服務器配置跨來源請求頭Access-Control-Allow-Origin: *,因爲你正在使用的軌道看看here
  • 即成您的應用程序的同一個域&端口下只有路徑http://myhost.com/app1http://myhost.com/app2

希望它可以幫助上variing。