getleftpart (UriPartial.Authority)返回https站点上的http

本文关键字:站点 http https 返回 UriPartial Authority getleftpart | 更新日期: 2023-09-27 18:06:27

我们使用Request.Url.GetLeftPart(UriPartial.Authority)来获取站点的域名部分。这满足了我们在http上的需求。我们最近更改网站为https(大约3天前),但这仍然返回http://..url全部改为https,并显示在浏览器地址栏中。

知道为什么会这样吗?

getleftpart (UriPartial.Authority)返回https站点上的http

下面的例子可以正常工作,并返回一个带有"https"的字符串:

var uri = new Uri("https://www.google.com/?q=102njgn24gk24ng2k");
var authority = uri.GetLeftPart(UriPartial.Authority);
// authority => "https://www.google.com"

您要么在这里有HttpContext类的问题,要么您的所有请求仍在使用http:

  1. 查看请求的HttpContext.Current.Request.IsSecureConnection属性。如果它是真的,并且GetLeftPart方法仍然为您返回http,我认为您不会在这里绕过替换。
  2. 如果你所有的请求都是通过http来的,你可以在IIS中强制一个安全连接。

您还应该检查传入的URL并将其记录在某个地方以供调试。

在处理负载均衡器时也可能发生这种情况。在我工作过的一种情况下,任何https请求都被负载均衡器转换为http。它仍然在浏览器地址栏中显示https,但在内部它是一个http请求,因此您对GetLeftPart()的服务器端调用返回http.

如果您的请求来自带有SSL卸载的ARR,Request.Url.GetLeftPart(UriPartial.Authority)获取http

在负载均衡的站点上,您可以使用以下命令检查它是否正在使用ssl运行…

String.Equals(Request.ServerVariables["HTTP_X_FORWARDED_PROTO"], "https", StringComparison.OrdinalIgnoreCase);

在没有负载平衡器的站点上,以下内容应该可以工作…

HttpContext.Current.Request.IsSecureConnection

GetLeftPart的替代解决方案。您可以在确定连接是否为https并构建路径

时检查这两个选项。
// get domain including scheme
bool isSecureConnection = HttpContext.Current.Request.IsSecureConnection;
if (!isSecureConnection)
{
    isSecureConnection = String.Equals(Request.ServerVariables["HTTP_X_FORWARDED_PROTO"], "https", StringComparison.OrdinalIgnoreCase);
}
string scheme = isSecureConnection ? "https" : "http";
string domain = string.Format("{0}://{1}/", scheme, HttpContext.Current.Request.Url.Authority);

来源:https://www.bugdebugzone.com/2013/12/identifying-https-or-ssl-connection-in.html