You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

curl提交荷兰警方违规烟花举报表单:302重定向后遇411错误求助

荷兰警方烟花举报表单批处理脚本curl问题排查

背景

我正在编写批处理脚本,帮助用户提交荷兰警方的违规烟花举报表单。脚本会收集用户个人信息,结合当前日期时间生成举报陈述,同时将个人信息填入表单,方便警方后续联系。

问题

发送POST请求时,服务器返回HTTP/1.1 302 Moved Temporarily状态码。使用curl的-L参数跟随重定向后,服务器返回HTTP/1.1 411 Length Required状态码。

环境

  • 系统:Windows
  • curl版本:8.0.1(libcurl/8.0.1 Schannel WinIDN)

已尝试的方案

  • 使用GET请求替代POST;
  • 添加--post302参数,引发无限循环;
  • 添加Content-Length: 0请求头,返回HTTP/1.1 403 Forbidden响应。

批处理脚本代码

:: First we set some variables such as name, place, date, time, etc (omitted here)

...

:: We then use these variables to create the 'data' variable
set data="melding_bericht=%melding_bericht%&plaats_voorval=%plaats_voorval%&straat_voorval=%straat_voorval%&bestanden=&voornaam=%voornaam%&tussenvoegsel=%tussenvoegsel%&achternaam=%achternaam%&straatnaam=%straatnaam%&huisnummer=%huisnummer%&huisnummer-toevoeging=%huisnummer_toevoeging%&postcode=%postcode%&woonplaats=%woonplaats%&telefoonnummer=%telefoonnummer%&email=%email%&transmit=Versturen"

:: Now issue the request to the server
curl "https://www.politie.nl/aangifte-of-melding-doen/meldformulier-vuurwerkoverlast.html" ^
  -X POST ^
  -L ^
  -H "authority: www.politie.nl" ^
  --data %data% ^
  --verbose

curl执行日志

首先服务器返回:

HTTP/1.1 302 Moved Temporarily

随后日志内容:

Issue another request to this URL: 'https://www.politie.nl/aangifte-of-melding-doen/meldformulier-vuurwerkoverlast.html? (the data in the form, omitted here)'

* Switch from POST to GET
* Found bundle for host: 0x21c63c12c50 \[serially\]
* Re-using existing connection #0 with host www.politie.nl

> POST /aangifte-of-melding-doen/meldformulier-vuurwerkoverlast.html?(the urlencoded data in the form, omitted here) HTTP/1.1

之后服务器返回:

HTTP/1.1 411 Length Required

疑问与解答

疑问1:为何curl日志显示要从POST切换到GET,但实际发起了另一个POST请求?

这是因为你在curl命令中添加了-X POST参数,强制curl始终使用POST方法。

按照HTTP规范,当POST请求收到302重定向时,curl的默认行为是将请求方法改为GET,并把原POST数据拼接到重定向URL的查询参数中——日志里的"Switch from POST to GET"就是这个默认逻辑的提示。但-X POST会覆盖这个默认行为,让curl不管重定向多少次都坚持用POST方法,所以实际发送的是POST请求,就出现了日志提示和实际请求方法不一致的情况。

疑问2:若不是上述情况,服务器为何对GET请求要求Content-Length?

服务器返回411并非针对GET请求,而是因为你强制发送的POST请求没有携带请求体:原POST数据已经被拼到了重定向后的URL查询参数里,此时的POST请求没有任何请求体内容。

根据HTTP规范,POST请求如果没有请求体,需要明确指定Content-Length: 0或使用Transfer-Encoding: chunked。但你之前添加Content-Length: 0后返回403,说明该服务器可能不接受空请求体的POST,或者需要额外的验证信息(比如表单页面的Cookie、CSRF令牌等你未携带)。

补充建议

  • 去掉-X POST参数,让curl按HTTP规范默认逻辑重定向为GET,验证服务器是否接受GET方式提交表单;
  • 先请求举报表单页面,获取必要的Cookie和隐藏字段(如CSRF令牌),再携带这些信息发送POST请求——多数政府网站会要求这类验证;
  • 检查重定向后的URL,避免同时在URL查询参数和POST请求体中携带相同数据。

内容的提问来源于stack exchange,提问作者Jurian Baas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:57:51