Rails ActionController 忽略请求 headers
Rails ActionController ignores request headers
我有一个简单的控制器方法,它通过 ActionController 的 #headers 方法记录 headers:
class ThingsController < ActionController::Base
def show
Rails.logger.info headers
render json: {response: 'success'}
end
end
但是,当我使用 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" \
而是记录了以下 headers:
{"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
我认为这与 CORS 无关。
在Rails 5.2中,ActionController实例方法#headers
被委托给response
object。
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"
要访问请求 headers,您可以通过 request
object 进行。 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 (and RFC 3875),客户端发送的 headers 以 HTTP_
为前缀,所有出现的 -
都替换为 _
。
要记录您通过 cURL 指定的 headers:
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
我有一个简单的控制器方法,它通过 ActionController 的 #headers 方法记录 headers:
class ThingsController < ActionController::Base
def show
Rails.logger.info headers
render json: {response: 'success'}
end
end
但是,当我使用 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" \
而是记录了以下 headers:
{"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
我认为这与 CORS 无关。
在Rails 5.2中,ActionController实例方法#headers
被委托给response
object。
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"
要访问请求 headers,您可以通过 request
object 进行。 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 (and RFC 3875),客户端发送的 headers 以 HTTP_
为前缀,所有出现的 -
都替换为 _
。
要记录您通过 cURL 指定的 headers:
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