gpt4 book ai didi

c# - 在 Heroku 上为只监听 https 的服务使用哪个环境变量

转载 作者:行者123 更新时间:2023-12-04 12:41:56 27 4
gpt4 key购买 nike

我正在使用将部署在 Heroku 上的 AspNet 核心设置一个仅限 https 的 Web API 服务。部署是通过 docker 完成的,所以我配置了一个 Dockerfile。但是每当我部署到 Heroku 时,我都会收到与 https 端口绑定(bind)相关的错误。我想知道 Heroku 是否为 https 提供了一个特殊的环境变量,服务可以在其中绑定(bind)以指定服务应该监听的 https 端口。

AspNet core 提供了 2 个环境变量 ASPNETCORE_HTTPS_PORT=5001ASPNETCORE_URLS=https://*:5001,其中可以指定服务应该监听的 https 端口。

但是由于 Heroku 不允许 Web 进程手动指定它应该监听的端口,因此他们提供了一个 Web 应用程序可以绑定(bind)到的 PORT 环境变量。

我已尝试使用 ASPNETCORE_HTTPS_PORT=$PORTASPNETCORE_URLS=https://*:$PORT,但出现以下错误:

crit: Microsoft.AspNetCore.Server.Kestrel[0]
Unable to start Kestrel.
System.Net.Sockets.SocketException (13): Permission denied at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, String callerName)
at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.Sockets.Socket.Bind(EndPoint localEP)
at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind()
at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.<>c__DisplayClass21_0`1.<<StartAsync>g__OnBind|0>d.MoveNext()

最佳答案

因此,在(广泛地)阅读了 Heroku 的文档之后,我能够解决这个问题。以下是与此问题相关的主要发现:

  1. Heroku uses a load balancer代理它的所有请求。
  2. Heroku 终止与您的应用程序的任何 SSL 通信,因此所有请求都通过 http 转发到您的应用程序;您客户的 https 请求通过 http 代理。
  3. 由于请求被代理,Heroku passes Forwarded headers对于原始请求。
  4. 您的应用只能接收请求和 should only listen to the PORT环境变量。

现在我已经记住了,我能够正确配置我的应用程序。

监听 http 而不是 https:ASPNETCORE_URLS=http://*:$PORT

在 AspNet 核心中间件管道中使用 FowardedHeaders 和 Rewriter 中间件:

var forwardedHeadersOptions = new ForwardedHeadersOptions {
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
};
forwardedHeadersOptions.KnownNetworks.Clear();
forwardedHeadersOptions.KnownProxies.Clear();
app.UseForwardedHeaders(forwardedHeadersOptions);

var rewriteOptions = new RewriteOptions ().AddRedirectToHttps(308);
app.UseRewriter(rewriteOptions);
...

ForwardedHHeaders 中间件 maps the Forwarded headers to HttpContext.Request .和重写器中间件 will redirect http request scheme to https .

关于c# - 在 Heroku 上为只监听 https 的服务使用哪个环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57966769/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com