【问题标题】:Rails ActionController ignores request headersRails ActionController 忽略请求标头
【发布时间】:2018-07-12 11:22:56
【问题描述】:

我有一个简单的控制器方法,它通过 ActionController 的 #headers 方法记录标题:

class ThingsController < ActionController::Base
  def show
    Rails.logger.info headers
    render json: {response: 'success'}
  end
end

但是,当我通过带有标头的 curl 调用此控制器方法时,它们不会被记录:

curl "http://localhost:3000/things/1” \
  -H "access-token XXX" \
  -H "token-type Bearer" \
  -H "client YYY" \
  -H "expiry 1234" \
  -H "uid test@test" \

相反,会记录以下标头:

{"X-Frame-Options"=>"SAMEORIGIN", "X-XSS-Protection"=>"1; mode=block", "X-Content-Type-Options"=>"nosniff"}

我认为我的 Rails 5 应用程序的 CORS 策略可能是罪魁祸首,所以我安装了 rack-cors gem 并在下面的初始化程序中配置它。不幸的是,它并没有改变结果。

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*'
    resource '*',
      headers: :any,
      methods: %i(get post put patch delete options head)
  end
end

【问题讨论】:

    标签: ruby-on-rails cors ruby-on-rails-5 rack rack-cors


    【解决方案1】:

    我认为这与 CORS 无关。

    在 Rails 5.2 中,ActionController 实例方法 #headers 被委托给 response 对象。 https://github.com/rails/rails/blob/v5.2.0/actionpack/lib/action_controller/metal.rb#L150

    delegate :headers, :status=, :location=, :content_type=,
             :status, :location, :content_type, to: "@_response"
    

    要访问请求标头,您可以通过request 对象进行。 http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-headers

    此外,您的 cURL 语法需要更改以分隔键和值。

    curl "http://localhost:3000/things/1” \
      -H "access-token: XXX" \
      -H "token-type: Bearer" \
      -H "client: YYY" \
      -H "expiry: 1234" \
      -H "uid: test@test" \
    

    根据Rack spec(和RFC 3875),客户端发送的标头以HTTP_为前缀,所有出现的-都替换为_

    要记录您通过 cURL 指定的标头:

    class ThingsController < ActionController::Base
      def show
        Rails.logger.info {
          request.headers.env.slice(
            "HTTP_ACCESS_TOKEN",
            "HTTP_TOKEN_TYPE",
            "HTTP_CLIENT",
            "HTTP_EXPIRY",
            "HTTP_UID"
          )
        }
        render json: {response: 'success'}
      end
    end
    

    【讨论】:

    • 谢谢!很好的答案。
    猜你喜欢
    • 1970-01-01
    • 2014-05-21
    • 2021-12-08
    • 2019-02-12
    • 1970-01-01
    • 2017-11-24
    • 2021-07-11
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多