我需要解耦前端和后端。我正在使用Rails作为后端和Backbone用于前端。
经过几天的反复试验,我能够在服务器上设置CORS。一切都归功于这个模块:
https://github.com/yaoweibin/nginx_cross_origin_module
现在我发现Backbone不支持开箱即用的跨域调用。
我想知道将Backbone与后端分离的最佳方法是什么?
我看到两个解决方案:
1)在Backbone模型/集合中写入指向服务器的路径,所以我将得到例如:
class App.Collections.Plots extends Backbone.Collection
model: App.Models.Plot
url: 'http://www.app.com/api/plots'
这意味着我还必须修补Backbone方法以支持跨域。
2)以这样的方式设置前端部分的rails-side,Rails,而不是Backone将对服务器进行跨域调用..这看起来很奇怪,因为Backbone应该使分离变得更容易现在我将回归到rails解决方案。
答案 0 :(得分:2)
现在我发现Backbone不支持开箱即用的跨域调用。
Backbone.js"支持"跨域调用。事实上,它并非特定于backbone.js,它是浏览器支持它的角色。在兼容CORS的浏览器中,每个请求(POST,GET)前面都有一个OPTIONS请求,用于检查服务器是否授权相应的POST或GET请求。
所以你只需要在rails应用程序中响应这个新的调用。例如:
class ApplicationController < ActionController::Base
before_filter :cors_preflight_check
after_filter :cors_set_access_control_headers
# 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-Methods'] = 'POST, GET, OPTIONS'
headers['Access-Control-Max-Age'] = "1728000"
end
# If this is a preflight OPTIONS request, then short-circuit the
# request, return only the necessary headers and return an empty
# text/plain.
def cors_preflight_check
if request.method == :options
headers['Access-Control-Allow-Origin'] = '*'
headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
headers['Access-Control-Allow-Headers'] = 'X-Requested-With, X-Prototype-Version'
headers['Access-Control-Max-Age'] = '1728000'
render :text => '', :content_type => 'text/plain'
end
end
end
这篇精彩帖子中的代码:http://www.tsheffler.com/blog/?p=428
因此,如果您的Nginx插件工作正常,您应该没问题。只需检查您的Access-Control-Allow-Origin
标头是否包含执行javascript的域名。