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】:
我猜您有几个选项,具体取决于您的应用是在开发模式还是生产模式下运行,它们是:
仅限开发模式
如果您使用chrome
或chromium
作为开发浏览器,您可以使用标志--args --disable-web-security
启动它
开发生产模式
如您所述,使用jsonp
添加到您的服务器配置跨域请求标头Access-Control-Allow-Origin: *
,因为您使用的是rails,看看here。
仅在路径 http://myhost.com/app1
、http://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 应用程序