jQuery、Ajax、WP、发布4000B长文本:404未找到(2000B = OK)?

3
这是我的第一篇/线程,我已经有一段时间没有在论坛上活跃了,因为说实话我并不需要它,但是这个问题困扰着我。 我尝试了我所知道的一切 - 我的意思是每一件事,我是一个狂热的试错测试者。
情况如下: jQuery通过Ajax将数据发送到服务器上的php文件,主要从$('#textarea')收集数据。 如果数据大于X字节,则会在Ajax错误处理程序中收到404 Not Found和404 Html页面。 否则,一切都很顺利,我可以得到结果。
我必须指出,我发布到一个php文件,该文件在执行计算之前加载Wordpress的wp-blog-header.php,因为该代码旨在成为WP插件的一部分。
- 我尝试返回header("HTTP/1.1 200 OK"),因为有些人建议这样做,考虑到WP正在更改标头,因为找不到文件作为系统的一部分,并且在某些情况下,它在本地解决了问题,但远程无法解决。 - 我尝试在ajax调用中设置Content-Length。 - 我在我的插件文件夹中交替使用WP处理Ajax调用的类型和自己的.php文件。 - 我在我的ajax文件开头交替调用wp-load.php、wp-config.php和wp-blog-header.php,但仍然没有任何作用(在本地解决了一些问题,但在远程没有解决)。 - 没有任何作用。唯一有效的方法是修剪发送到.php文件的内容。2000-2500B可以正常工作,3000+B会给我404未找到。
这是什么原因?服务器上的post_data_size为8M。 这可能与SSL有关吗,因为我在某些情况下看到过这种情况?这是服务器端的问题吗? 请帮帮我,
P.S.我的Javascript:
var data1 = {
    action: 'get-tables',
    html: $('#content').val(),
    nonce: kwd_settings.nonce
};
$.ajax({
    url: kwd_settings.ajax_url,
    type: 'POST',
    data: data1,
    scriptCharset: 'utf-8',
    timeout: 10000, /*10 seconds*/
    beforeSend: function( xhr ) {
        xhr.setRequestHeader("Content-length", $('#content').val().length+500);
        showProgress(true);
    },
    error: function (request, ajaxOptions, thrownError) {
        alert(request.statusText);
        alert(request.responseText);
        showProgress(false);
    },
    success: function( response ) {
        var r= response;
        showResponse(r);
    }
});

你能成功地发布一个带有4000B+文本区域的常规HTML表单吗? - Álvaro González
刚试了一下,不行,出现404错误。这变得有趣了。URL变成了正确的kwd-ajax.php,但显示404错误页面。所以我猜这不是ajax的问题,而是一个Post的问题。如果我用一些简短的文本替换它,就可以了。 - Catalin
好的:刚刚发布了一个长达28,000个字符的文本,没有出现任何错误。我认为我的算法可能是一个内存占用过多或其他问题,我使用了一个分配了很多内存结构的htmlTools类。将不得不转移到PHP DOM解析函数。 - Catalin
更重要的是:文本中有一个短语引发了崩溃,因此这是算法错误...我会解决的。感谢大家的帮助 :) - Catalin
伙计们,这一定是个奇妙的地方:问题出在这几个词上:“你基本上会创建”。我把Ajax文件清空只剩一个回声“这里”。当我让这两个单词在主体中时,它给我返回了一个内部服务器错误(转移到了一个新的测试服务器)。当我取消它们时,它显示“这里”。这简直不真实... 你有遇到过这样的行为吗? - Catalin
3个回答

1
我知道这是一个老问题,但由于没有解决方案,而且我刚刚发现了这个问题的解决方案(我花了一整天进行故障排除),所以我觉得值得发布。问题出在IIS中默认的“请求筛选”选项上。我不得不打开“请求筛选”屏幕,点击“编辑功能设置”(在屏幕右侧)并将允许的最大内容长度、URL长度和查询字符串长度更改为允许我的帖子的数量。然后我重新启动了IIS,ERROR 404停止了,我的帖子也完成了 :)。
我在网上找不到这个答案,原因不明。

1
唯一的问题是,他正在使用Apache而你在谈论IIS。因此这不是他问题的解决方案。 - shaggy

0

根据您在进一步评论中描述的症状:

  1. 简单的常规POST也失败了。
  2. 故障取决于精确的数据内容而不是原始大小。
  3. 包含create的字符串会触发该问题,这表明试图通过SQL注入来防止损坏。

... 我建议您先了解一下您的托管服务是否安装了某种安全模块,例如mod_securitySuhosin。到目前为止,这是最有可能的嫌疑人。


是的,我想是这样:仅从该短语中取消CREATE一词也会触发错误。但是,我已经在.htaccess中使用<IfModule mod_security.c>禁用了mod_security: SecFilterEngine Off SecFilterScanPOST Off </IfModule> 但仍然没有效果。所以我猜AllowOverride被设置为Off?我不知道这个,我无法访问服务器设置...有什么想法为什么.htaccess不能禁用mod_security吗? - Catalin
@Catalin - 可能没有安装mod_security或者在.htaccess中不允许使用SecFilterScanPOST(无论如何,在文档中我找不到它)。 - Álvaro González
我在想:那些编写大量JavaScript的人是如何保护自己免受此类问题的影响的呢?感觉它太容易受攻击了,而且很容易因为某些配置而无法正常工作。既然这是商业产品,我该如何保护客户不受各种配置的影响呢?您认为在POST之前对文本进行base64编码是否是一个解决方案? - Catalin
相信我,服务器的配置有多糟糕是没有限制的。我想我们都会在问题出现时添加特定的解决方法。 - Álvaro González
抱歉重新激活这篇帖子,最终我使用了base64编码内容。但我有一个问题:WordPress如何在同一服务器上发布相同的内容并使其正常工作?他们是如何编写程序(也许wp在发布之前调整内容?)以超越所有服务器限制的?也许我可以应用相同的技巧。 - Catalin

0

尝试设置:

xhr.setRequestHeader("Content-length", 0);

尝试过了。同样的响应,Ajax错误和404。我在控制台中看到的响应是“拒绝设置不安全的头部“Content-length””。 - Catalin
好的,服务器不允许您设置未定义的长度。您可能想看一下这个:https://dev59.com/gW035IYBdhLWcg3wSN4G。 - matthijs koevoets

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接