【问题标题】:Redirect external http connection within internal network重定向内部网络中的外部 http 连接
【发布时间】:2019-11-13 15:29:15
【问题描述】:

网络结构

当用户从互联网连接时,他总是被转发到容器 A。

这些容器都包含 asp.net core mvc 应用程序。

问题
根据容器 A 中发生的决定,我希望能够将客户端重定向到容器 B 或容器 C。这些容器在未发布到 Internet 的端口 5001 和 5002 上运行。

我尝试了什么

  • asp.net Redirect函数的不同组合
  • nginx upstram 和代理功能(主要在this 等设置中)

我试图为 asp.net core 找到一些直通功能,但找不到。

【问题讨论】:

  • HTTP 重定向只会告诉客户端/浏览器向新 URL 发出另一个 HTTP 请求。如果该 URL 不可访问,则无法进行重定向。
  • 好吧,你必须设置 nginx 以便它知道用户何时想要访问容器 B 或 C,通常通过将 url(如 /containerB/)分配给相应的端口(5001)然后您只需重定向到 /containerB/。
  • @Longoon12000 这会不会导致与重定向相同的问题(由 JohnathanBarclay 指出)?
  • @91378246 通过配置 nginx 以便您的容器可以访问,然后不行。正如 Johnathan 所说的那样,如果 URL(例如容器 B 和 C)不可访问,那么您将无法重定向到它们(好吧,您可以但您将无法访问它们)。因此,为什么您必须使它们易于访问。如果您只有一个端口 80/443 用于三个不同的应用程序,那么您必须让 nginx 确定通过 URL 转发到哪个端口(到容器 A、B 或 C)。
  • @Longoon12000 是的,但问题是,我想在转发之前先通过容器 A 传递每个连接。为 /ContainerB/ 创建一个位置将使它可以从外部访问。

标签: c# asp.net-mvc nginx asp.net-core nginx-reverse-proxy


【解决方案1】:

1) 如果所有服务的主机名和方案相同(http/https),则使用相对路径

2) 如果没有,则配置 nginx 反向代理,为代理应用提供以下标头:

   proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header    X-Forwarded-Proto $scheme;
   Host $host:$server_port

在 asp 应用程序中配置 UseForwardedHeaders

    services.Configure<ForwardedHeadersOptions>(options =>
    {
        options.ForwardedHeaders =
            ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
        options.KnownNetworks.Clear();
        options.KnownProxies.Clear();
    });
    ....
    app.UseForwardedHeaders();

它将用客户端发出的初始请求填充 Request.Scheme 和 Request.Host
使用此信息重定向

https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-3.1

【讨论】:

  • 俄语文档链接可能对不懂俄语的访问者没有太大帮助。我想您可以将 ru-ru 更改为 en-US 并希望微软不会注意到(他们似乎有重命名或删除人们链接到的任何内容的政策)。
猜你喜欢
  • 2020-05-13
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多