首页 > 解决方案 > node.js Azure Web App 在长 url 上返回 400

问题描述

我在 Azure Web 应用程序中托管了一个 node.js 应用程序。这很好用,除了如果请求太长,服务器总是返回 HTTP 400(即长 URL 或许多标头。)

似乎 Kestrel 网关返回了错误而没有到达我的应用程序,如果请求的长度超过 2581 个字节,就会发生这种情况。在本地运行时不会出现同样的问题。这是一个 GET 请求,无论 URL 是长的,还是有长的 headers 都没有区别。

我的应用程序只是返回当前时间:

// Module dependencies
let http = require('http');

http.createServer(function (request, response) {
    console.log('request ', request.url);

    response.write("Request served at " + new Date().toISOString());
    response.end();
}).listen(80);

如果我要求GET /anything响应符合预期。但是,如果我这样做GET /{any_very_long_path}(或包含一个长值的标题)它会失败。

为什么 Azure 会像这样限制请求长度?托管 ASP.NET 应用程序时不会发生同样的问题。

标签: node.jsazurehttpkestrel-http-server

解决方案


如果我要求GET /anything响应符合预期。

但是,如果我这样做GET /{any_very_long_path}或包含一个长值的标题)它会失败。

我相信这个问题与@GitHub的这个问题有关,它提到:

在我们的网站上,在某些情况下我们有相当大的 cookie(它可能确实不是很好),并且从昨天开始我们已经面临许多400 个http 错误。

这是因为有一个8KB硬编码 ( HTTP_MAX_HEADER_SIZE) 限制,任何更大的东西都会返回错误代码400......

Nodejs 文档:http.maxHeaderSize

只读属性,指定 HTTP 标头的最大允许大小(以字节为单位)。默认为 8KB。可使用 --max-http-header-sizeCLI 选项进行配置。

解决方案 :

您可以尝试使用--max-http-header-sizeCLI 选项作为文档提及。

请记住,如果您在中间使用反向代理(例如 NGINX),您还必须增加最大标头大小......


推荐阅读