为什么我的习惯 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无关。当 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的回答。