【问题标题】:UriHelper how to get production url pathUriHelper 如何获取生产 url 路径
【发布时间】:2019-09-06 02:25:39
【问题描述】:
var displayUrl = UriHelper.GetDisplayUrl(Request);
var urlBuilder = new UriBuilder(displayUrl) {  Query = null, Fragment = null };

string _activation_url = urlBuilder.ToString().Substring(0, urlBuilder.ToString().LastIndexOf("/")) +"/this_is_my_link.html";

我希望得到正确的 uri 生产路径,但我仍然得到 ​​p>

http://localhost:5000/api/mdc/this_is_my_link.html

我在 centos 7 上部署了这个

请帮帮我..

谢谢

不要

【问题讨论】:

  • 你前面有什么反向代理吗?如果是,反向代理是否发送诸如X-Forwarded-ForX-Forwarded-HostX-Forwarded-Proto 之类的标头?最后,您是否已将您的应用程序配置为接受这些(并信任反向代理)?

标签: c#


【解决方案1】:

关于asp核心的使用

absoluteUri = string.Concat(
                           request.Scheme,
                           "://",
                           request.Host.ToUriComponent(),
                           request.PathBase.ToUriComponent(),
                           request.Path.ToUriComponent(),
                           request.QueryString.ToUriComponent());

或者你可以选择 Getting absolute URLs using ASP.NET Core

【讨论】:

  • 你能解释一下这是如何解决问题的吗?我不相信这有什么不同,尤其是当 implementation of the method OP is using 与您提出的解决方案从同一位置获取 Host 值时。
  • 如果您使用github.com/aspnet/HttpAbstractions/blob/…。使用公共静态字符串 GetEncodedUrl(此 HttpRequest 请求)
  • 我的意思是你的方法和OPs方法都使用request.Host,所以OP会从你的方法以及那些方法中得到localhost
  • 如果 request.Host 总是返回 localhost,这可能是网络设置不正确,我建议您在 github.com/aspnet/AspNetCore 上创建问题
  • 这似乎不太可能是一个错误。更可能的情况是在使用带有反向代理的 ASP.NET Core 时配置不正确。如果您没有将 ASP.NET Core 设置为接受反向代理提供的标头,那么看起来所有请求都来自反向代理(如果它在同一台机器上,反向代理可能会连接到 API 为localhost),而不是实际的客户端。如果 OP 确认是这种情况,我会提供一个答案:)
【解决方案2】:

如果您使用反向代理,您应该阅读 Microsoft 的 this guide

基本上,您的反向代理应该向您的 ASP.NET Core 应用程序提供这些标头:

  • X-Forwarded-For - 客户端 IP
  • X-Forwarded-Host - 来自客户端的 Host 标头(例如 www.example.com:80
  • X-Forwarded-Proto - 协议(例如HTTPS

然后您需要配置您的 ASP.NET Core 应用程序以接受它们。您可以通过在 Startup 的 Configure 方法中调用 app.UseForwardedHeaders() 方法来实现。

By default(如果我正确阅读了文档)UseForwardedHeaders(如上所述)将接受来自localhost 反向代理的X-Forwarded-ForX-Forwarded-Proto

如果您的情况比这更复杂,您必须配置您想要的标头/受信任的反向代理:

var forwardedOptions = new ForwardedHeadersOptions()
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedHost | ForwardedHeaders.XForwardedProto // allow for, host, and proto (ForwardedHeaders.All also works here)
};

// if it's a single IP or a set of IPs but not a whole subnet
forwardedOptions.KnownProxies.Add(IPAddress.Parse("192.168.0.5"));

// if it's a whole subnet
forwardedOptions.KnownNetworks.Add(new IPNetwork("192.168.0.1", 24)); // 192.168.0.1 - 192.168.0.254

app.UseForwardedHeaders(forwardedOptions);

另请注意,根据您使用的反向代理,您可能需要在反向代理上进行配置

【讨论】:

    猜你喜欢
    • 2011-07-30
    • 2017-01-09
    • 2019-07-23
    • 1970-01-01
    • 2021-05-30
    • 2018-11-13
    • 2013-11-13
    • 2011-05-28
    • 2016-08-03
    相关资源
    最近更新 更多