在开展项目以使我们的网站HTML 5友好时,我们渴望采用跨域请求的新方法(不再通过隐藏的iframe发布!!!)。使用Access Control规范,我们开始设置一些测试来验证各种浏览器的行为。
当前的Rails RESTful架构依赖于四个HTTP谓词:GET,POST,PUT,DELETE。但是,在访问控制规范中,它规定非简单方法(PUT,DELETE)需要使用HTTP谓词OPTIONS的飞行前请求。此外,在测试期间,我们还发现了Firefox 3.5.8的飞行前POST请求。
我的问题是这个。是否有人知道Rails框架的任何项目正在解决这个问题?如果没有,有关支持OPTIONS方法的最佳策略的任何意见,因为它必须支持所有POST,PUT,DELETE方法的路由?
答案 0 :(得分:8)
我几天前发布了一个Gem,它通过Rack Middleware实现了CORS支持:
http://github.com/cyu/rack-cors
关于预检CORS请求,我无法获得在Chrome中工作的预检请求(通过简单的CORS请求正常工作)。在互联网上搜索表明它可能不受支持。我在Chrome论坛中就此问了一些问题,但还没有听到回复。
答案 1 :(得分:3)
这是来自Spine js文档
CORs Rails集成
让我们创建一个cor方法,它会将一些请求访问控制头添加到请求的响应中。
将以下内容添加到app / application_controller.rb:
before_filter :cor
def cor
headers["Access-Control-Allow-Origin"] = "js-app-origin.com"
headers["Access-Control-Allow-Methods"] = %w{GET POST PUT DELETE}.join(",")
headers["Access-Control-Allow-Headers"] = %w{Origin Accept Content-Type X-Requested-With X-CSRF-Token}.join(",")
head(:ok) if request.request_method == "OPTIONS"
end
虽然Access-Control-Allow-Origin采用通配符,但我强烈建议不要使用它,因为它会为各种CSRF攻击打开你的应用程序。使用白名单会更好,更安全。
Access-Control-Allow-Headers部分非常重要,尤其是X-Requested-With标头。如果你在没有这个头的情况下向它发送Ajax请求,Rails不喜欢它,并忽略请求的Accept头,当它实际上应该返回JSON时返回HTML。
值得注意的是,jQuery默认情况下不会将此标头添加到跨域请求中。这是Spine内部解决的问题,但是如果你使用普通的jQuery for CORs,你需要手动指定标题。
jQuery.ajaxSetup({
headers: {"X-Requested-With": "XMLHttpRequest"}
});
某些浏览器首先向服务器发送选项请求,以确保设置了正确的访问标头。您需要在Rails中捕获此信息,并使用正确的标头返回200状态。为此,请将以下内容添加到应用程序的config / routes.rb文件中:
match '*all' => 'application#cor', :constraints => {:method => 'OPTIONS'}
就是这样,你们都为Spine设置了Cross Origin Requests!
答案 2 :(得分:0)
我攻击了rails以支持options方法。我将它发布在rails列表中,但它从未超出列表。
GitHub要点:Rails XHR2 / CORS / OPTIONS support
ctrl + f查找具有#Options的行 - 这些是我更改过的行。