如何防止HAProxy删除带有下划线的HTTP标头

我们有一个API后端服务器,需要某些包含下划线的HTTP头。 我知道,这不是最好的做法,标题应该使用连字符,但我不能改变这一点。

我们使用nginx作为代理服务器,并使用underscores_in_headers on选项。 这会导致nginx不删除这些头文件。

现在我们要切换到HAProxy,并在configuration更改之前将其作为nginx使用下划线删除标题。 有没有办法阻止HAProxy下拉字头?

  • Nginx中的顺序是否重要?
  • 为什么PHP-FPM只使用一个进程?
  • 制作一个服务器pipe理多个网站
  • nginx是否允许上游服务器在完成之前响应并closures请求?
  • 与amazon s3与nginx服务静态文件
  • “ImportError:No modules named flask” - 在virtualenv设置中nginx + uWSGI + Flask问题
  • One Solution collect form web for “如何防止HAProxy删除带有下划线的HTTP标头”

    你有没有真正testing过,HAProxy下拉式标头?

    从源代码看起来好像没有。 在这个答案中,我将尝试解释:

    • 为什么在HTTP中允许标头中的下划线
    • 为什么Nginx默认情况下会丢弃它们
    • 为什么我相信HAProxy不会这样做。

    HTTP / 1.1和Nginx

    根据RFC 7230 3.2.6中的HTTP / 1.1规范,头字段中的下划线( _ )没有任何错误; 这只是不常见的。

    字段值组件

    大多数HTTP头字段值是使用由空格或特定分隔字符分隔的常用语法组件(标记,引用string和注释)定义的。 分隔符是从令牌( DQUOTE(),/:;<=>?@[\]{} )中不允许的US-ASCII可视字符集合中select的。

     token = 1*tchar tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA ; any VCHAR, except delimiters 

    Nginx陷阱和常见错误: 丢失(消失)的HTTP Headers解释了为什么它们仍默默地被丢弃:

    如果你没有明确地设置underscores_in_headers on; ,NGINX会默默地放下HTTP标头(这是根据HTTP标准完全有效的)。 这是为了防止将标题映射到CGIvariables时出现歧义,因为在该过程中,破折号和下划线都被映射为下划线。


    HAProxy的

    不幸的是, HAProxy没有这样的设置 。 如果您通过HAProxy configuration手册searchunderscore ,则仅在环境variables节点名称 (如DNS名称中), 代理名称ACL名称的上下文中提及。 在HTTP请求章节中没有提到。

    如果HAProxy没有使用下划线来删除标题,那么在configuration中你就不能做任何事情,而且你必须坚持使用Nginx或修改HAProxy的源代码。

    然而,我试图findHAProxy在那里proto_http.c ,无法从proto_http.c的函数void capture_headers()void http_msg_analyzer()find这样的事情。

    另外, proto_http.c按types列出了所有ASCII字符, (),/:;<=>?@[\]{}被列为HTTP_FLG_SEP而下划线被列为普通标记:

     495 /* It is about twice as fast on recent architectures to lookup a byte in a 496 * table than to perform a boolean AND or OR between two tests. Refer to 497 * RFC2616/RFC5234/RFC7230 for those chars. A token is any ASCII char that is 498 * neither a separator nor a CTL char. An http ver_token is any ASCII which can 499 * be found in an HTTP version, which includes 'H', 'T', 'P', '/', '.' and any 500 * digit. Note: please do not overwrite values in assignment since gcc-2.95 501 * will not handle them correctly. It's worth noting that chars 128..255 are 502 * nothing, not even control chars. 503 */ 504 const unsigned char http_char_classes[256] = { 505 [ 0] = HTTP_FLG_CTL, 545 ['('] = HTTP_FLG_SEP, 546 [')'] = HTTP_FLG_SEP, 547 ['*'] = HTTP_FLG_TOK, 548 ['+'] = HTTP_FLG_TOK, 549 [','] = HTTP_FLG_SEP, 550 ['-'] = HTTP_FLG_TOK, 551 ['.'] = HTTP_FLG_TOK | HTTP_FLG_VER, 570 ['A'] = HTTP_FLG_TOK, 571 ['B'] = HTTP_FLG_TOK, 572 ['C'] = HTTP_FLG_TOK, 600 ['_'] = HTTP_FLG_TOK, 

    在这里, _就像ABC一样是一个正常的HTTP_FLG_TOK ; 它不应该引起任何特别的。

    服务器问题集锦,包括 Linux(Ubuntu, Centos,Debian等)和Windows Server服务器.