node.js - 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 应用程序时不会发生同样的问题。
解决方案
如果我要求
GET
/anything
响应符合预期。但是,如果我这样做
GET
/{any_very_long_path}
(或包含一个长值的标题)它会失败。
我相信这个问题与@GitHub的这个问题有关,它提到:
在我们的网站上,在某些情况下我们有相当大的 cookie(它可能确实不是很好),并且从昨天开始我们已经面临许多400 个http 错误。
这是因为有一个8KB
硬编码 ( HTTP_MAX_HEADER_SIZE
) 限制,任何更大的东西都会返回错误代码400
......
只读属性,指定 HTTP 标头的最大允许大小(以字节为单位)。默认为 8KB。可使用
--max-http-header-size
CLI 选项进行配置。
解决方案 :
您可以尝试使用--max-http-header-size
CLI 选项作为文档提及。
请记住,如果您在中间使用反向代理(例如 NGINX),您还必须增加最大标头大小......