Nginx 过滤含点自定义请求头的原因及解决方案是什么?
Nginx过滤含特殊字符自定义请求头的成因与解决方案
成因
- Nginx默认对HTTP请求头名称做了合法性校验,默认仅允许大小写英文字母、数字、连字符
-三类字符,包含点.、下划线_等其余特殊字符的请求头会被判定为非法,默认直接丢弃不会转发给上游服务。 - 该设计的初衷是为了适配CGI规范:请求头转发给CGI程序时会被转换为环境变量,而环境变量命名不允许出现点等特殊字符,默认拦截非法请求头可以避免后续解析出现异常或安全风险。例如
world.peace请求头转环境变量会得到HTTP_WORLD.PEACE,点号不符合大多数系统的环境变量命名规则,因此Nginx默认做了过滤。
处理方法
方案1:调整请求头命名(最优方案)
将自定义请求头中的特殊字符替换为Nginx默认允许的连字符-,例如将world.peace修改为world-peace,无需修改任何Nginx配置即可正常转发,兼容性最高,无版本限制。
方案2:修改Nginx配置允许特殊字符请求头
如果业务必须保留含点、下划线的请求头命名,可调整Nginx配置放行合法的特殊字符:
- 首先确认你的Nginx版本 >= 1.11.5,该版本起支持
valid_header_names自定义合法请求头规则 - 在Nginx的
http/server/location配置块中添加如下配置:
# 允许请求头包含下划线 underscores_in_headers on; # 自定义合法请求头正则:允许字母、数字、连字符、点、下划线 valid_header_names ~^[a-zA-Z0-9-_.]+$;
- 执行配置校验命令
nginx -t确认配置无误后,执行nginx -s reload平滑重启Nginx即可生效。
如果你的Nginx版本低于1.11.5,无valid_header_names指令支持,只能选择方案1调整请求头命名,或者先升级Nginx版本后再使用方案2。
内容的提问来源于stack exchange,提问作者2333333
相关产品推荐
相关产品推荐

