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

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

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

【问题讨论】:

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


    【解决方案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 上。我会看看那个。回答您的问题,每个应用都是单独提供的。
      猜你喜欢
      • 2021-08-30
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 2017-02-26
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      相关资源
      最近更新 更多