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

Posted

技术标签:

【中文标题】如何在反向代理后面获取应用程序基本 URL【英文标题】:How to get application base url while behind reverse proxy 【发布时间】:2013-12-09 20:05:52 【问题描述】:

在通过反向代理/网关的请求的上下文中,ASP.NET 应用程序是否能够在知道自己的路由的情况下派生其 url 路径和主机名?

通过网关请求此 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);

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

【问题讨论】:

我假设您使用 Url.Content("~") 而不是 Url.Link 得到类似的结果? @C.Barlow 不同,但在 MVC 控制器中,它只返回应用程序内的相对路径,即 /api/values/1 (使用上面的示例)。使用反向代理网关,这将解析到无法正确路由的 url 路径。 这里有一些创意......其中一些有点老套,但可能会给你你需要的东西:***.com/questions/1288046/… 【参考方案1】:

我们的安全入口服务器也存在同样的问题。 对于 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,希望可以复制和粘贴)

【讨论】:

以上是关于如何在反向代理后面获取应用程序基本 URL的主要内容,如果未能解决你的问题,请参考以下文章

在反向代理后面使用 OAuth2 的 Spring Boot

使用自定义基本 URL 为 Keycloak docker 配置反向代理

反向代理后面的 .NET 6 OAuth 身份验证:质询时重定向 url 错误

反向代理 404 后面的 Blazor 服务器端

Nginx 使用反向代理 解决异步api获取问题!

Nginx 如何设置反向代理