为什么我的习惯 header 有时不存在?
Why is my custom header not present sometimes?
当 运行 落后于 nginx 和 Phusion Passenger 时,如何让我的自定义 header 一直到我的 Rails 应用程序?这是可能的,请参阅下面的详细信息,但是当我只使用 Paw 中的 headers 窗格时,它没有通过。
我正在使用 Paw 在 Rails 应用程序中测试和开发一些 API 端点。在我的开发环境中一切都按预期工作,这是一个 Rails 6 应用程序 运行 在 macOS 上使用 Puma。为了安全起见,我使用了包含个人身份验证令牌的自定义 header。当我检查 Rails 请求 object 时,特别是 request.headers
,我能够看到所有 header 包括我的自定义 header 并且我可以基于它的价值。
问题出现在我的暂存系统上 运行 时,我几乎无法控制环境。在这里,相同的 Rails 应用程序在 nginx 后面的 Phusion Passenger 下 运行。当我用相同的请求访问相同的端点时,只是更改请求中的主机,自定义 header 不存在。我通过将所有 header 写入暂存中的每个请求的文件来验证这一点。
header去哪儿了?由于暂存环境不同,我怀疑 nginx 或 Fusion Passenger 正在接收 header 但没有将其传递到我的 Rails 应用程序。我无法验证这一点,因为我无法访问 Rails 应用程序日志以外的日志。该应用程序旨在从外部服务获取请求,因此我通过该服务发送了一些请求并且 header 存在。这很奇怪,所以有些 header 正在通过,有些则没有。
Paw(header 在 header 窗格下定义)。
我使用 cURL 进行了检查:
curl -X 'https://example.com/ivr/main_menu' -H 'X_JSW_AUTH_TOKEN':'my_tkn'
与Ruby的Net::HTTP:
uri = URI('https://example.com/ivr/main_menu')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
req = Net::HTTP::Post.new(uri)
req.add_field "X_JSW_AUTH_TOKEN", "my_tkn"
res = http.request(req)
使用 HTTPie:
http POST 'https://example.com/ivr/main_menu' 'X_JSW_AUTH_TOKEN':'my_tkn'
使用来自 httprb 的 http gem:
resp = HTTP.headers(X_JSW_AUTH_TOKEN: "my_tkn").post("https://example.com/ivr/main_menu")
看来答案与Paw无关。当 cURL、HTTPie 和 Net::HTTP 都具有与 Paw 相同的结果时,有相当确凿的证据。
问题是 nginx 如何通过忽略默认情况下处理带下划线的 headers。有关详细信息,请参阅“Why do HTTP servers forbid underscores in HTTP header names”。
Ruby 的 HTTP 能够为我的应用程序提供 header,这样做是因为它将 [=] 中的下划线 (“_”) 替换为连字符 (“-”) 21=] 个名字,因此这些 header 成功进入了 Rails 应用程序。 Rails 然后用下划线替换 header 请求名称中的连字符。因此,发送方 (HTTP) 和接收方 (Rails) 都在幕后进行替换。这使得排除故障变得更加困难。
非常感谢Chris Oliver的回答。
当 运行 落后于 nginx 和 Phusion Passenger 时,如何让我的自定义 header 一直到我的 Rails 应用程序?这是可能的,请参阅下面的详细信息,但是当我只使用 Paw 中的 headers 窗格时,它没有通过。
我正在使用 Paw 在 Rails 应用程序中测试和开发一些 API 端点。在我的开发环境中一切都按预期工作,这是一个 Rails 6 应用程序 运行 在 macOS 上使用 Puma。为了安全起见,我使用了包含个人身份验证令牌的自定义 header。当我检查 Rails 请求 object 时,特别是 request.headers
,我能够看到所有 header 包括我的自定义 header 并且我可以基于它的价值。
问题出现在我的暂存系统上 运行 时,我几乎无法控制环境。在这里,相同的 Rails 应用程序在 nginx 后面的 Phusion Passenger 下 运行。当我用相同的请求访问相同的端点时,只是更改请求中的主机,自定义 header 不存在。我通过将所有 header 写入暂存中的每个请求的文件来验证这一点。
header去哪儿了?由于暂存环境不同,我怀疑 nginx 或 Fusion Passenger 正在接收 header 但没有将其传递到我的 Rails 应用程序。我无法验证这一点,因为我无法访问 Rails 应用程序日志以外的日志。该应用程序旨在从外部服务获取请求,因此我通过该服务发送了一些请求并且 header 存在。这很奇怪,所以有些 header 正在通过,有些则没有。
Paw(header 在 header 窗格下定义)。
我使用 cURL 进行了检查:
curl -X 'https://example.com/ivr/main_menu' -H 'X_JSW_AUTH_TOKEN':'my_tkn'
与Ruby的Net::HTTP:
uri = URI('https://example.com/ivr/main_menu') http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_PEER req = Net::HTTP::Post.new(uri) req.add_field "X_JSW_AUTH_TOKEN", "my_tkn" res = http.request(req)
使用 HTTPie:
http POST 'https://example.com/ivr/main_menu' 'X_JSW_AUTH_TOKEN':'my_tkn'
使用来自 httprb 的 http gem:
resp = HTTP.headers(X_JSW_AUTH_TOKEN: "my_tkn").post("https://example.com/ivr/main_menu")
看来答案与Paw无关。当 cURL、HTTPie 和 Net::HTTP 都具有与 Paw 相同的结果时,有相当确凿的证据。
问题是 nginx 如何通过忽略默认情况下处理带下划线的 headers。有关详细信息,请参阅“Why do HTTP servers forbid underscores in HTTP header names”。
Ruby 的 HTTP 能够为我的应用程序提供 header,这样做是因为它将 [=] 中的下划线 (“_”) 替换为连字符 (“-”) 21=] 个名字,因此这些 header 成功进入了 Rails 应用程序。 Rails 然后用下划线替换 header 请求名称中的连字符。因此,发送方 (HTTP) 和接收方 (Rails) 都在幕后进行替换。这使得排除故障变得更加困难。
非常感谢Chris Oliver的回答。