我有一个 Joomla 网站,每当我通过表单提交某些内容时,就会收到 HTTP 413 错误:
请求的实体太大
请求的资源/index.php不允许用POST请求来请求数据,或者请求中提供的数据量超出了容量限制。
在 error.log 文件中我得到:
内容长度无效,引用:[site]/index.php
这似乎与请求的实际大小无关,原因如下:
a) 我修改了 Apache 和 PHP 的配置。在 Apache 中,我尝试增加 LimitRequestBody,在 PHP 中,我尝试增加 post_max_size、max_input_vars、memory_limit 甚至 upload_max_filesize。每个值都远远超出了生成错误的典型请求中发送的值。
b) 错误随机弹出,通常只需点击刷新就可以解决。
c) 我在 Fiddler 中检查了请求,以确保标头中的内容长度和请求本身的内容均正确无误。一切似乎都正常。奇怪的是,当我通过 Fiddler 重新发送完全相同的请求时,我从未收到错误。似乎我只能通过浏览器重新创建它。
所以我现在束手无策了。我甚至不知道在哪里可以找到问题。我不知道是 Apache 还是 PHP(虽然我在 PHP 错误日志中找不到任何东西,所以也许这意味着 Apache 更可能是罪魁祸首?),或者一般是 PHP,或者特别是我的 Joomla 网站(我一直认为是 Joomla,直到我在测试脚本上重现了错误,使用了一个非常基本的帖子表单,尽管它在 Joomla 网站上出现的频率更高)。
如果有人能就从哪里开始提供任何建议,我将非常感激!
答案1
是时候突破了Wireshark[.org]。捕获实际的 HTTP 请求,这样您就可以看到实际的总大小。请记住,包括 http 标头(包括 cookie)在内的总请求大小可能会超出限制。某些浏览器插件或代理可能会增加请求的大小。
答案2
好吧我想我终于到达某个地方了!
我在服务器上设置 wireshark 时遇到了麻烦,所以我首先使用了 apache 的日志格式指令使用 %I 参数记录请求中的字节数。
我注意到,当我收到 413 错误时,服务器收到的请求字节数比正确处理时少。然后我使用mod_dumpio查看整个请求,果然,当我收到错误时,很多内容都缺失了。此外,日志中弹出 70007 代码,据我所知,这意味着超时。
所以我开始认为问题可能出在我的连接上,而不是服务器的问题。我请一些人测试了该网站,没有人报告任何问题,所以我猜就是这样。
所以最后我猜这里没什么可看的,但也许我的经历可以让一些可怜的灵魂免受我所经历的压力。