什么样的网络中间层能把 Content-Type 改为 Content_Type

2022 年 6 月 30 日
 sqmwin

事情是这样,python 同事在 A 网络环境发送 Content-Type=multipart/form-data 的文件上传 HTTP 请求。 我在 B 网络环境接收,A 和 B 中间有类似防火墙的机制。 结果在 Nginx 这一层提示 invalid header Content_Type ,发现变成了下划线的请求头了 而且在后端使用 Java 接收接口时,压根就没有了此请求头,也就导致文件上传的请求失败。 现在处理方式就是在 nginx 中加了个配置 underscores_in_headers on 将 Content_Type 头部设置到 Content-Type 中,才完成了请求。 结果收到请求体后发现,每次请求都比发送的包少一部分,大概 1/4

4395 次点击
所在节点    程序员
18 条回复
THESDZ
2022 年 6 月 30 日
自己开发的网关?
realpg
2022 年 6 月 30 日
https 呢
xiangyuecn
2022 年 6 月 30 日
花几十块钱买一个服务器,上传到那上面去 完美绕过🐶
doomfirst
2022 年 6 月 30 日
Content_Type 是自己自定义的 header 头字段 应该是流量转发的时候 改写了 中间人代理?
bugfan
2022 年 6 月 30 日
把 http 改成 https 尝试一下
估计有 waf
lolizeppelin
2022 年 6 月 30 日
搞不好是 python 的锅
python 很多库接收 http 请求的时候会把-换成下划线
出去的时候又把下划线转回-

搞不好你同事哪里搞错了
sqmwin
2022 年 6 月 30 日
@realpg 因为是两边都是内网内部环境,https 暂时用不到
sqmwin
2022 年 6 月 30 日
@THESDZ 也不清楚中间网关是怎么处理的
sqmwin
2022 年 6 月 30 日
@lolizeppelin 能展开说说吗,或者有没有链接。python 处理 http 请求
lolizeppelin
2022 年 6 月 30 日
翻下 python http 库不就知道了

以为 python 可以用 req.content_type 访问变量不能用 req.Content-Type 形式访问
所以代码内部-换成_,然后统一 lower 所有 header 是很常见的处理方法

一般会在出去的时候下划线统一换回-,然后首字母大写
Martens
2022 年 6 月 30 日
可以用排除法排查下是不是 py 的问题,比如用其他语言做上传,实验
popvlovs
2022 年 6 月 30 日
@Martens 那也不用其他语言,写个 curl 就可以验证了吧
realpg
2022 年 6 月 30 日
@sqmwin #7
https 就是防止这种事情的绝佳工具
内网可自己签
rekulas
2022 年 6 月 30 日
为了安全 内网也应该上 ssl
vone
2022 年 7 月 1 日
你让你的 python 同事在 A 网络环境直接把数据发送到 https://postman-echo.com/post ,这个地址会把你的请求内容原封不动的返回给你。这样你就可以知道你发出去的原始内容有没有问题。
eudore
2022 年 7 月 1 日
Content_Type 这个不符合 header 命名规范
sqmwin
2022 年 7 月 3 日
@realpg 感谢 能给个关键词吗,内网自签名?
sqmwin
2022 年 7 月 3 日
@vone 第一次听说可以用这个工具,谢谢了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/863186

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX