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,并显示在浏览器地址栏中。
知道为什么会这样吗?
下面的例子可以正常工作,并返回一个带有"https"的字符串:
var uri = new Uri("https://www.google.com/?q=102njgn24gk24ng2k");
var authority = uri.GetLeftPart(UriPartial.Authority);
// authority => "https://www.google.com"
您要么在这里有HttpContext
类的问题,要么您的所有请求仍在使用http:
- 查看请求的
HttpContext.Current.Request.IsSecureConnection
属性。如果它是真的,并且GetLeftPart
方法仍然为您返回http,我认为您不会在这里绕过替换。 - 如果你所有的请求都是通过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