如何在反向代理后面获取应用程序基础URL

时间:2013-12-09 20:05:52

标签: c# asp.net-mvc asp.net-web-api reverse-proxy urlhelper

ASP.NET应用程序是否有任何方法能够在通过反向代理/网关的请求的上下文中知道自己的路由来获取其url路径和主机名?

通过网关请求此网址时:

http://conoso.com/behind/some/reverseproxy/api/values/

请求正由网关重新路由到其他位置:

http://10.0.0.0/api/values

使用DefaultApi路径访问以下ApiController ValuesController的Get方法:

// GET api/values
public HttpResponseMessage Get()
{
  var res = Request.CreateResponse();
  res.Headers.Add(
    "Location",
    Url.Link(
      "DefaultApi",
      new
        {
          id = 1
        }));
  return res;
}

返回以下标头值:

Location: http://10.0.0.0/api/values/1

虽然我希望发送有效路径:

Location: http://conoso.com/behind/some/reverseproxy/api/values/1

在框架中使用内置方法的替代方法是手动格式化字符串:

var baseUrl = "http://conoso.com/behind/some/reverseproxy";
string.Format("{0}/values/1", baseUrl);

但这会散发一些邪恶的代码气味。是否有人可以提出更清洁的方法?

1 个答案:

答案 0 :(得分:0)

我们的安全入口服务器背后存在同样的问题。 对于REST调用,我们希望在服务器端生成URL以使它们在java脚本中可用。但它们不包括安全入口服务器添加的子路径。

所以我们提出了类似的解决方法(在布局页面中呈现):

<a id="urlBase" href="/" style="display: none;"></a>
<script type="text/javascript">
    baseUrl = document.getElementById('urlBase').getAttribute('href');
</script>

href="/"已被href="/path/"的入口服务器替换,我们可以在访问REST服务时轻松地将baseUrl与我们的相对路径连接起来。

希望它对你的情况也有帮助。

(我发布了相同的答案here,希望可以复制和粘贴)