curl提交荷兰警方违规烟花举报表单:302重定向后遇411错误求助
背景
我正在编写批处理脚本,帮助用户提交荷兰警方的违规烟花举报表单。脚本会收集用户个人信息,结合当前日期时间生成举报陈述,同时将个人信息填入表单,方便警方后续联系。
问题
发送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

