gpt4 book ai didi

c# - 如何让 URL 客户端来自反向代理?

转载 作者:太空宇宙 更新时间:2023-11-03 15:46:11 26 4
gpt4 key购买 nike

我有一个 Controller Action,我在其中:

  1. 将 URL 转发给第 3 方,如果操作成功,第 3 方会将客户端重定向到该 URL。
  2. 然后客户端连接到第 3 方并执行操作。
  3. 如果成功,第 3 方会将客户重定向(使用 302)到我们在第 1 步中告诉他们的 URL。

这一切都有效。问题是服务器上的 Controller 告诉第 3 方我们使用的 URL:

var urlHelper = new UrlHelper(System.Web.HttpContext.Current.Request.RequestContext);
var responseUrl = urlHelper.Action("Action", "Controller", new { id }, Request.Url.Scheme);

responseURL 现在看起来像:

"https://some.internal.domain/App/Action/1234 "

然而,客户端使用如下地址访问该站点:

"https://example.com/App/Action/1234 "

他们无法访问 https://some.internal.domain外部。

那么我如何为第 3 方构建绝对 URL 以将客户端重定向到使用客户端访问网站的 URL

更新: 上述方法应该有效,结果证明问题出在反向代理后面(已重新措辞标题以反射(reflect)这一点)。

最佳答案

我遇到了类似的问题。您基本上有两个选择。

  1. 使用 URL 重写模块重写您的整个响应,方法是将所有与 https://some.internal.domain 匹配的模式替换/重写为 https://example。 com/应用程序。您可能想要添加某些条件,例如仅当响应类型为 html/text 类型时才重写,否则。

  2. 使用扩展方法。此方法要求相关反向代理转发附加 header ,以标识原始请求的来源(例如,Azure 应用程序网关发送名为 X-Original-Host 的 header ,但我认为大多数其他反向代理使用 X-Forwarded-For 或某些变体,例如 Winfrasoft X-Forwarded-For)。因此,根据提供的示例,您可以执行类似的操作。

助手可能看起来像这样

public static class UrlHelpers
{
public static string GetUrlHostname(this UrlHelper url)
{
var hostname = url.RequestContext.HttpContext.Request.Headers["X-Original-Host"] ?? url.RequestContext.HttpContext.Request.Url.Host;
return hostname;
}
}

然后根据您的示例使用它。

var urlHelper = new UrlHelper(System.Web.HttpContext.Current.Request.RequestContext); 
var responseUrl = urlHelper.Action("Action", "Controller", new { id }, Request.Url.Scheme, urlHelper.GetUrlHostname());

关于c# - 如何让 URL 客户端来自反向代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28059222/

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