【问题标题】:Client sent malformed Host header in AJAX call客户端在 AJAX 调用中发送了格式错误的 Host 标头
【发布时间】:2016-06-19 16:05:27
【问题描述】:

在 AJAX 调用中,我将文本框值作为对象发送到 ASP.NET 页面方法,如下面的示例所示。我面临的问题是,当任何文本框值包含 space 我得到错误:

错误请求
您的浏览器发送了此服务器无法理解的请求。

客户端发送了格式错误的主机头

虽然我使用的是data: JSON.stringify(obj),但几乎 90% 的尝试都失败了。但是,当所有文本框值都没有 space 时,请求每次都会完成。试图弄清楚但无法发现问题。

var obj = {};
obj.CapCode = $.trim($('#CapTextBox').val());
obj.Registered_Name = $.trim($('#Registered_NameTextBox').val()).replace(/\s\s+/g, ' ');
obj.eMail = $.trim($('#e_MailTextBox').val());
$.ajax({
    type: "POST",
    url: 'Register.aspx/SaveRecord',
    data: JSON.stringify(obj),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (resultData) {
        try {
            $("#User_modal").modal();
        }
        catch (err) {
            alert('ERROR:\n An error occurred while getting records. Try again.');
        }
    },
    error: function (x, e, m) {
        errorHandler(x, e, m, $("#btnSave"), false);
    },
});

以上代码在开发系统上运行没有任何问题,但在生产上出现此错误

【问题讨论】:

  • 你猜到了吗?
  • 不,我检查了几乎所有内容,前端、后端、服务器日志、页面加载等,但没有解决方案。我怀疑这可能是由模板中使用的一些 jquery/bootstrap 插件引起的。只是为了测试,我删除了所有模板 css、js 文件和 ajax 并尝试将记录保存到成功的服务器。
  • 我最终用空格替换了+,而在服务器端则相反

标签: jquery asp.net ajax http-headers bad-request


【解决方案1】:

我认为这可能是问题的解决方案,但我无法对其进行测试,因为我在服务器上没有足够的权限;)http://tools.cherrypy.org/wiki/ModRewrite#Bewaretheencodingbug

通过 HTTP 请求的 URL 在发送之前必须转义(%xx 编码),但 Apache2 的 mod_rewrite 不会转义可能生成无效 HTTP 请求的路径信息。特别是,空格(应该转义为“%20”)不是。

# this cannot be on .htaccess (only on httpd.conf)
RewriteMap escape int:escape 

#and when writing RewriteRule:
RewriteRule ^(.*)$ http://localhost:6674/${escape:$1} [proxy]
#(i.e., use ${escape:$1} instead of $1)

【讨论】:

    猜你喜欢
    • 2012-10-18
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多