【问题标题】:Rails CORS - simple request: allowed methods option is ignoredRails CORS - 简单请求:忽略允许的方法选项
【发布时间】:2018-04-06 13:44:04
【问题描述】:

我基于 Rails 5 构建 API。我使用 'rack-cors' gem 来控制 CORS。下面的代码被剪断了,我想知道:

    config.middleware.insert_before 0, Rack::Cors do
      allow do
        origins '*'
        resource '*', headers: :any, methods: %i()
      end
    end

我从允许的方法数组中删除了所有 HTTP 方法,但我仍然可以成功调用 GET、POST(禁止删除,我明白了)。正如我所看到的,OPTIONS、GET、POST 被忽略了,因为即使它是空的,我也可以使用这些方法调用服务器。正常吗?如果是这样,如何禁止例如使用 CORS 发布?

【问题讨论】:

    标签: ruby-on-rails ruby cors


    【解决方案1】:

    methods 值仅控制服务器在响应 Access-Control-Allow-Methods 标头的值中返回的方法名称以响应 CORS preflight OPTIONS request — 即仅适用于非“简单”请求。

    因此,如果您的请求具有触发预检的特征,那么浏览器才会检查 Access-Control-Allow-Methods 响应标头的值以查看请求方法是否被允许,因此只有这样您的 methods 值才会配置有任何效果。

    否则,您的浏览器将允许任何不会触发预检的跨域 GETPOST — 任何“简单”请求 — 不考虑您配置的任何 methods 值。

    如何禁止使用 CORS 发布?

    您不能使用 CORS 禁止“简单”POST 请求。您只能禁止非简单的POST 请求——那些出于某种原因触发了预检的请求。

    或者,通过使用headers 选项,您可以设置Access-Control-Allow-Headers 标头值——这将导致浏览器禁止任何非简单的预检请求,这些请求的标头名称与您的标头名称不同使用 headers 选项指定。

    【讨论】:

    • 所以 [:get, :head, :post, :put, :patch, :delete, :options] 获得与 [:put, :patch, :delete] 相同的效果?
    • @mike927 对于简单的请求,是的,它们具有相同的效果 ー 也就是说,它们都没有任何效果。但是对于预检请求,它们反而具有不同的效果——也就是说,正是您期望它们具有的效果。具体来说,如果该方法值没有 :post,浏览器将禁止预检 POST 请求
    • 嘿,我终于明白了!我感到困惑如何可以与 GET 一起执行预检请求。我忘记了 HTTP 方法以外的其他限制,例如自定义标头。绝对是最佳答案!
    【解决方案2】:

    如果你只想允许特定的方法,比如 GET 和 OPTIONS,试试这个:

    config.middleware.insert_before 0, Rack::Cors do
      allow do
        origins '*'
        resource '*', :headers => :any, :methods => [:get, :options]
      end
    end
    

    更多信息here

    【讨论】:

    • 不,这不是我的问题。我想知道为什么我可以使用GET、POST,即使有排除。
    • 我明白你的意思,请问,你是如何调用服务器的?
    【解决方案3】:

    Rack-cors gem 将方法和标头的默认值设置为 :get

    因此,如果您传递空字符串或空数组或 nil,它会将其视为 :any,因此它允许获取、发布等请求。

    【讨论】:

    • 我没有看到 opts[:methods] 在空白数组的代码中的任何地方设置为 :any。如果opts[:methods]没有通过,它正在接[:get]
    • 检查第 351 行 ensure_enum(opts[:methods]) || [:get]
    • 准确来说,检查enure_enum的实现。如果 opts[:methods] 为 nil(不是这种情况),它将返回 nil,否则它将发送在 opts[:methods] 中传递的扁平化 http 动词数组(为空)。
    猜你喜欢
    • 2019-01-04
    • 2018-08-22
    • 2019-02-18
    • 2023-03-10
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 2013-07-16
    相关资源
    最近更新 更多