我有Controller
行动,其中我:
这一切都有效。问题是服务器上的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:上面的方法应该有效,事实证明问题是在反向代理背后(已经重新措辞标题反映了这一点)。
答案 0 :(得分:0)
我遇到了类似的问题。您基本上有两个选择。
使用URL重写模块通过将与https://some.internal.domain
匹配的所有模式替换/重写为https://example.com/App
来重写整个响应。您可能想要添加某些条件,例如仅当响应类型为html/text
而不是类型时才重写。
使用扩展方法。此方法要求所涉及的反向代理转发其他标头,以标识原始请求的来源(例如,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());