【问题标题】:How to get URL client is coming from behind a reverse proxy?如何获取 URL 客户端来自反向代理?
【发布时间】:2015-01-21 03:38:17
【问题描述】:

我有一个Controller 操作,其中我:

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

这一切都有效。问题是服务器上的控制器告诉第 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

更新: 上面的方法应该有效,事实证明问题出在反向代理后面(已重新措辞以反映这一点)。

【问题讨论】:

  • UrlHelper.Action 不是已经在请求的主机上工作了,如果不这样做的话?我认为您也不必告诉它Request.Url.Scheme。无论如何,Request.Url 没有做你想要的事情有什么原因吗?
  • 我希望 UrlHelper 能够解决该请求,但它似乎没有发生。我告诉它方案来获取我想要的绝对 URL。也许我可以使用 Request.Url 并做我自己的字符串连接来构造 URL,现在尝试......
  • 那么它作为主机返回什么?如果不是现在的?那么接下来我会研究UriBuilder。或者我认为即使是 Uri 构造函数也可能会发生过载,该构造函数将采用方案 (Request.Url)、主机 (Request.Url) 和路径 (UrlHelper.Action(string, string, object))。这至少比串联要好。
  • 不幸的是,这也是给some.internal.domain/App/Action/1234
  • 嗯。这会增加一些混乱。似乎您最好的选择是检查标题。我从未使用过那个特定的代理,但大多数代理都会向上游服务器添加一个标头,以告知有关传入请求的一些信息。如果外部请求是唯一通过代理的请求,这将很容易。

标签: c# asp.net-mvc asp.net-mvc-4 .net-4.5


【解决方案1】:

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

  1. 使用 URL 重写模块通过将与 https://some.internal.domain 匹配的所有模式替换/重写为 https://example.com/App 来重写整个响应。您可能需要添加某些条件,例如仅在响应类型为 html/text 类型时才重写等。

  2. 使用扩展方法。此方法需要有问题的反向代理转发其他标头,以标识原始请求的来源(例如,Azure 应用程序网关发送一个名为 X-Original-Host 的标头,但我认为大多数其他反向代理使用 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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2020-10-27
    • 2020-10-21
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    相关资源
    最近更新 更多