【问题标题】:node.js Azure Web App returns 400 on long urlsnode.js Azure Web App 在长 url 上返回 400
【发布时间】:2019-06-15 02:43:49
【问题描述】:

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

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

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

// 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 应用程序时不会发生同样的问题。

【问题讨论】:

  • 在 kestrel 中,没有最大 url 长度之类的东西,但也许你已经更改了 Kersel MaxRequestLineSize 而你不知道它(通常最大长度为 8kb)docs.microsoft.com/en-us/dotnet/api/…。您的问题还缺少一些数据,例如您使用的 url 或您发送到服务器的请求?
  • 我没有更改该设置,但不幸的是,服务器是由 Azure 提供和配置的,而我无法对其进行配置。我将更新问题以描述如何触发问题。
  • GET url 不应保留太长。长度没有标准限制,但浏览器也有一些限制technomanor.wordpress.com/2012/04/03/maximum-url-size
  • @TarunLalwani 同意了,但是请求长的原因是 Azure AD 设置的 URL 参数和 cookie。不幸的是,这些都超出了我的控制范围。

标签: node.js azure http kestrel-http-server


【解决方案1】:

如果我请求GET /anything,则响应符合预期。

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

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

在我们的网站上,在某些情况下我们有相当大的 cookie(它可能 确实不好),自那以后我们一直面临许多 400 http 错误 昨天。

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

Nodejs Documentation : http.maxHeaderSize

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

解决办法:

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

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

【讨论】:

  • 原来是这个问题。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 2022-01-12
  • 2018-08-17
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2021-09-11
相关资源
最近更新 更多