如何获取URL客户端来自反向代理?

时间:2015-01-21 03:38:18

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

我有Controller行动,其中我:

  1. 如果操作成功,则将URL转发给第三方重定向客户端的第三方。
  2. 客户端然后连接到第三方并执行操作。
  3. 如果成功,第三方将客户端重定向(使用302)我们在步骤1告诉他们的URL。
  4. 这一切都有效。问题是服务器上的Controller通过以下方式告诉第三方我们构建的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

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

    UPDATE:上面的方法应该有效,事实证明问题是在反向代理背后(已经重新措辞标题反映了这一点)。

1 个答案:

答案 0 :(得分:0)

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

  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());