Request.Url.GetLeftPart(UriPartial.Authority)在https网站上返回http

18
我们使用Request.Url.GetLeftPart(UriPartial.Authority)来获取网站域名部分。这在http上满足了我们的要求。 最近我们将网站更改为https(大约三天前),但是这仍然返回http://... URL已全部更改为https,并且在浏览器地址栏中显示。
有任何想法为什么会发生这种情况吗?

1
如果想获取域名,则使用此 Environment.UserDomainName。 - Rachit Patel
我想要这里的协议和域名/端口,不仅仅是域名。 - kapz
4个回答

26

以下示例可以正常工作,并返回一个带有 "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属性。如果它为true,并且对于你来说GetLeftPart方法仍然返回http,我认为你无法避免替换。
  2. 如果所有请求确实都是使用http,你可以在IIS中强制执行安全连接。

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


3
你的第二个观点是个问题!他们已经在 DNS 级别上绑定了 SSL(我对此一无所知)。IIS 只开放了 80 端口,所以它仍然是 HTTP。 - kapz

7

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


4
如果您的请求来自启用了SSL卸载功能的ARR,则 Request.Url.GetLeftPart(UriPartial.Authority) 只会获取http。

0
在负载均衡的网站上,您可以使用以下方法检查是否正在使用 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接