apache - curl 命令将 gzip 压缩的 POST 正文发送到 apache 服务器

标签 apache curl post compression gzip

在我的 apache 2.2 服务器上正确激活 mod_deflate 后,我尝试通过curl 命令行发送 gzipped 正文。

我见过的所有教程都说添加 -H'Content-Encoding: gzip' 并 gzip 我的正文文件,但是这失败了:

echo '{ "mydummy" : "json" }' > body
gzip body
curl -v -i http://localhost/mymodule -H'Content-Encoding: gzip' --data-binary @body.gz 

我的 apache 模块接收到 0 字节

在我的 apache error.log 中,如果 LogLevel 设置为调试,我得到:
[Thu Jun 01 14:29:03 2017] [debug] mod_deflate.c(900): [client 127.0.0.1] 无法膨胀输入:无法处理 deflate 标志

最佳答案

问题是 mod_deflate 不喜欢这里显示的 gzip header :

hexdump -C body.gz
00000000  1f 8b 08 08 20 08 30 59  00 03 62 6f 64 79 00 ab  |.... .0Y..body..|
00000010  56 50 ca ad 4c 29 cd cd  ad 54 52 b0 52 50 ca 2a  |VP..L)...TR.RP.*|
00000020  ce cf 53 52 a8 e5 02 00  a6 6a 24 99 17 00 00 00  |..SR.....j$.....|
00000030

解决方案很简单,将其交给 gzip,无需中间文件步骤,如果采用流,它不会打印 header ,apache 会喜欢正文!

echo '{ "mydummy" : "json" }' | gzip > body.gz
curl -v -i http://localhost/mymodule -H'Content-Encoding: gzip' --data-binary @body.gz

这有效,apache 模块接收解压后的字节。

您可以在这里看到 header 差异,您不再在 gzip 文件中看到文件名(正文):

hexdump -C body.gz
00000000  1f 8b 08 00 08 0a 30 59  00 03 ab 56 50 ca ad 4c  |......0Y...VP..L|
00000010  29 cd cd ad 54 52 b0 52  50 ca 2a ce cf 53 52 a8  |)...TR.RP.*..SR.|
00000020  e5 02 00 a6 6a 24 99 17  00 00 00                 |....j$.....|
0000002b

关于apache - curl 命令将 gzip 压缩的 POST 正文发送到 apache 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44307771/

相关文章:

php - 如何使用 PHP cURL 从 API 获取链接标题(用于分页)

php 没有将正确的值存储到数据库中

java - 在 java 中使用 JSON 到 bitbucket 服务器的 HTTP POST 返回 400 作为响应代码

php - 如何处理 CURL 403 forbidden 错误?任何解决方案?

php - 使用客户端证书进行身份验证

php - 获取多个输入的值

java - 如何处理 Out Fault 拦截器中的运行时异常,Apache CXF

django - Apache 无法访问为 Django 项目设置的虚拟环境

apache - 可能对网络服务器进行攻击,如何解码请求以找出?

php - 将 PHP Web 服务和 ASP.NET 网站连接到同一个 MySQL