6

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

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

4

3 回答 3

7

是的,对不同端口的请求是跨域请求。浏览器正在发出预检 OPTIONS 请求 (CORS) 并且没有得到答案。然后它会丢弃原始请求。您需要让服务器使用正确的 CORS 标头响应此 OPTIONS 请求。然后浏览器将发出原始请求。

这是有关 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 插件可以处理这个问题:rack-cors

于 2013-06-26T02:21:42.147 回答
0

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

仅开发模式

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

开发生产模式

  • jsonp像你已经提到的那样使用
  • 添加到您的服务器配置 Cross-Origin Request 标头Access-Control-Allow-Origin: *,因为您使用的是 rails 看看这里
  • 在相同的域和端口下为您的应用提供服务,仅在路径http://myhost.com/app1等方面有所不同http://myhost.com/app2

希望能帮助到你。

于 2013-06-25T22:37:54.700 回答
0

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

https://github.com/metajack/tape

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

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

于 2013-06-25T22:26:59.000 回答