1

我正在尝试使用 Rails 服务器创建 RESTful 服务。我看过网上的教程,显然我做错了什么。我的错误是 CORS 问题。我有一个用户模型和控制器。在我的用户控制器中,我试图更改标题以允许任何站点能够从服务器中提取信息。

class UsersController < ApplicationController
  def options
    if access_allowed?
      set_access_control_headers
      head :ok
    else
      head :forbidden
    end
  end

  private
    def set_access_control_headers
      # headers['Access-Control-Allow-Origin'] = request.env['HTTP_ORIGIN']
      headers['Access-Control-Allow-Origin'] = '*'
      headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
      headers['Access-Control-Max-Age'] = '1000'
      headers['Access-Control-Allow-Headers'] = '*,x-requested-with'
    end


    def access_allowed?
      allowed_sites = '*' #you might query the DB or something, this is just an example
      return allowed_sites.include?(request.env['HTTP_ORIGIN'])
      return true
    end
end

我还设置了路由,因此当服务器被击中时,它会转到“选项”操作。

  resources :users, :only => [:create]
  match '/users', :controller => 'users', :action => 'options', :via => :get

我在我的开发机器上创建了一个 html 页面,我只是从 Chrome 打开它(我不知道这是否是一个问题。)当我试图抓住用户时,我得到

OPTIONS http://www.*****.com:3000/users 404 (Not Found) jquery.js:3
XMLHttpRequest cannot load http://www.****.com:3000/users. Origin file:// is not allowed by Access-Control-Allow-Origin.

有人请让我知道我做错了什么,或者指出一个可以帮助我的方向。

4

1 回答 1

2

您的路线指定接受一个GET请求 ( :via => :get),但看起来您的实际请求是一个OPTIONS请求。

尝试将您的更改match为:

match '/users', :controller => 'users', :action => 'options', :via => :options

另请注意,您的操作名称不必是options,它可以是您想要的任何名称。

作为参考,以下是OPTIONS请求应返回的内容:

返回服务器对指定 URL 支持的 HTTP 方法。这可用于通过请求“*”而不是特定资源来检查 Web 服务器的功能。

是一篇关于在 Rails 中响应选项请求的文章。

于 2013-01-25T03:50:30.127 回答