Ember应用程序请求Rails应用程序 - 跨域?

时间:2013-06-25 22:21:21

标签: javascript ruby-on-rails ember.js cross-domain localhost

我在同一台服务器上有两个独立的应用程序,一个ember应用程序和一个rails应用程序。现在,我正在本地测试。

我的Ember请求不会发送到rails(localhost:3000)。我似乎无法弄清楚这是否正在发生,因为它认为这是一个跨域请求。它是否会被视为跨域请求,即使它们位于同一台服务器上?如果是这样,那么无论如何都要避免这种跨域请求,因为它们位于同一台服务器上而不会影响安全性吗?或者我需要坚持使用JSONP吗?

3 个答案:

答案 0 :(得分:7)

是的,对不同端口的请求是跨域请求。浏览器正在进行预检OPTIONS请求(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

来自routes.rb:

match '/*path' => 'application#cors_preflight_check', :via => :options

还有一个可以处理此问题的机架插件:rack-cors

答案 1 :(得分:0)

你不会说你正在运行什么平台,但我发现这种事情的最佳解决方案是磁带

https://github.com/metajack/tape

这将允许您设置一个小的反向代理 - 并在为您的JS服务时将URL映射到您的rails应用程序。

安全沙箱将不同的端口视为不同的域,因此如果您正在为您的余烬服务,则需要一个反向代理,并且需要单独使用。

答案 2 :(得分:0)

我猜您有几个选项,具体取决于您的应用是否在开发或生产模式下运行,这是:

仅限开发模式

  • 如果您使用chromechromium作为您的开发浏览器,则可以使用标记--args --disable-web-security
  • 启动它

开发和生产模式

  • 使用您已提及的jsonp
  • 添加到您的服务器配置交叉源请求标头Access-Control-Allow-Origin: *,因为您使用rails看起来here
  • 在相同的域名下为您的应用提供服务端口仅在路径http://myhost.com/app1http://myhost.com/app2
  • 上变化

希望它有所帮助。