nginx对请求中带下划线的情况说明

发布时间 2023-11-07 15:31:30作者: John_2011

遇到一个问题,nginx 完全做反向代理的时候,当有请求来的时候,后端服务器,有时可以很快返回结果,但有时根本没有访问到后端服务器

查了下发现nginx 这个需要手动进行配置,让nginx 支持下划线

Syntax: underscores_in_headers on | off;
Default:
underscores_in_headers off;
Context: httpserver

原因就能看到了,默认配置是是不开启的,当一个请求有带有下划线的时候,nginx会直接过滤掉这样的请求

但是开发那边不会考虑这样的问题,所以在http配置区域里,把这个功能开启,让nginx支http header有下划线的请求

源码如下:

rc = ngx_http_parse_header_line(r, r->header_in, cscf->underscores_in_headers);

 if (r->invalid_header && cscf->ignore_invalid_headers)

 

在ngx_http_parse_header_line() 函数中

if (ch == ‘_’) {
                if (allow_underscores) {
                    hash = ngx_hash(hash, ch);
                    r->lowcase_header[i++] = ch;
                    i &= (NGX_HTTP_LC_HEADER_LEN – 1);

 

                } else {
                    r->invalid_header = 1;
                }

红色部门就是问题所在

原来是对header name的字符做了限制,默认 underscores_in_headers 为off,表示如果header name中包含下划线,则忽略掉。

处理办法:

1:配置中http部分 增加underscores_in_headers on; 配置

2:用减号-替代下划线符号_,避免这种变态问题。nginx默认忽略掉下划线可能有些原因。