Ember 应用程序对 Rails 应用程序的请求——跨域?

Posted

技术标签:

【中文标题】Ember 应用程序对 Rails 应用程序的请求——跨域?【英文标题】:Ember App Requests to Rails App -- Cross Domain? 【发布时间】:2013-06-22 21:55:15 【问题描述】:

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

我的 Ember 请求没有出轨 (localhost:3000)。我似乎无法弄清楚这是否正在发生,因为它认为这是一个跨域请求。它是否会被视为跨域请求,即使它们在同一台服务器上?如果是这样,是否有办法避免这种跨域请求,因为它们在同一台服务器上而不影响安全性?还是我需要坚持使用 JSONP?

【问题讨论】:

【参考方案1】:

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

【讨论】:

我正在使用rack-cors,但是再次运行请求时,我的 Rails 服务器没有显示任何内容。跨域请求是否完全显示在 Rails 服务器上然后被拒绝,或者 AJAX 是否在它们被发送之前预先拒绝它们? 如果AJAX 在跨域请求被发送之前阻止它们,那么cors 的意义何在? AJAX 总是为跨域请求发送 pre-flight OPTIONS 请求。一些浏览器调试工具不显示这一点。我无法让 rak-cors 工作,所以我自己实现了 OPTIONS 请求处理。【参考方案2】:

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

仅限开发模式

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

开发生产模式

如您所述,使用jsonp 添加到您的服务器配置跨域请求标头Access-Control-Allow-Origin: *,因为您使用的是rails,看看here。 仅在路径 http://myhost.com/app1http://myhost.com/app2 等路径上的相同域和端口下为您的应用提供服务。

希望对你有帮助。

【讨论】:

【参考方案3】:

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

https://github.com/metajack/tape

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

不同的端口,被安全沙箱视为不同的域,因此如果您要为您的 ember 提供服务,您将需要一个反向代理,并单独运行。

【讨论】:

我的本地环境是 OS X,但我将部署在 Linux 上。我会看看那个。回答您的问题,每个应用都是单独提供的。

以上是关于Ember 应用程序对 Rails 应用程序的请求——跨域?的主要内容,如果未能解决你的问题,请参考以下文章

Ember.js + Leaflet + rails(使用 Javascript MVC 创建 Rails 应用程序并打开源地图)

使用 Ember 项目运行 Yeoman 和 Rails 的缺点/优点和可行性?

在 AWS Elastic Beanstalk 上部署 Rails / Ember 应用程序

Rails CSRF 保护与单页应用程序(反应,角度,余烬)

使用rails和ember.js创建PDF

Ember 身份验证最佳实践?