【问题标题】:Why is my custom header not present sometimes?为什么我的自定义标题有时不存在?
【发布时间】:2019-10-08 19:36:31
【问题描述】:

在 nginx 和 Phusion Passenger 后面运行时,如何将我的自定义标头一直获取到我的 Rails 应用程序?有可能,请参阅下面的详细信息,但是当我只使用 Paw 中的标题窗格时,它不会通过。

我正在使用 Paw 在 Rails 应用程序中测试和开发一些 API 端点。在我的开发环境中一切正常,这是一个使用 Puma 在 macOS 上运行的 Rails 6 应用程序。为了安全起见,我使用了一个包含个人身份验证令牌的自定义标头。当我检查 Rails 请求对象,特别是 request.headers 时,我能够看到所有的标头,包括我的自定义标头,并且我可以根据它的值进行身份验证。

在我的登台系统上运行时出现问题,我对环境几乎没有控制权。在这里,相同的 Rails 应用程序在 nginx 后面的 Phusion Passenger 下运行。当我用相同的请求访问相同的端点时,只是更改请求中的主机,自定义标头不存在。我通过将所有标头写入暂存中的每个请求的文件来验证这一点。

标题去哪儿了?由于暂存环境不同,我怀疑 nginx 或 Fusion Passenger 正在接收标头,但没有将其传递给我的 Rails 应用程序。我无法验证这一点,因为除了 Rails 应用程序的日志之外,我无权访问其他日志。该应用程序旨在从外部服务获取请求,因此我通过该服务发送一些请求并且存在标头。这很奇怪,所以有些标头被传递,有些则没有。

  • Paw(在标题窗格下定义的标题)。

  • 我使用 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")
    

【问题讨论】:

    标签: http curl paw-app


    【解决方案1】:

    似乎答案与 Paw 无关。当 cURL、HTTPie 和 Net::HTTP 都具有与 Paw 相同的结果时,有相当确凿的证据。

    问题是默认情况下nginx如何通过忽略它们来处理带有下划线的标题。有关详细信息,请参阅“Why do HTTP servers forbid underscores in HTTP header names”。

    Ruby 的 HTTP 能够为我的应用程序提供标头,这样做是因为它将标头名称中的下划线 (“_”) 替换为连字符 (“-”),因此这些标头可以通过 Rails 应用程序。然后 Rails 用下划线替换请求头名称中的连字符。因此,发送方 (HTTP) 和接收方 (Rails) 都在幕后进行替换。这使得故障排除变得更加困难。

    非常感谢Chris Oliver 的回答。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 2013-03-26
      • 2017-09-01
      • 1970-01-01
      • 2020-03-06
      相关资源
      最近更新 更多