Request.Url.Scheme は負荷分散サイトで https ではなく http を返します 質問する

Request.Url.Scheme は負荷分散サイトで https ではなく http を返します 質問する

私は新しい負荷分散ステージングサイトをテストしており、https はサイトレベルではなくロードバランサーレベルで設定されています。また、このサイトは常に https なので、リモートの https 属性などは必要ありません。URL には https が表示されますが、コードでは使用できません。このため、いくつかの問題が発生しています。

Request.Url.Scheme は常に http: です。

public static string GetProtocol()
        {
            var protocol = "http";
            if (HttpContext.Current != null && HttpContext.Current.Request != null)
            {
                protocol = HttpContext.Current.Request.Url.Scheme;
            }
            return protocol;
        }

このベースURLも同様で、プロトコルはhttpです

public static string GetBaseUrl()
        {
            var baseUrl = String.Empty;

            if (HttpContext.Current == null || HttpContext.Current.Request == null || String.IsNullOrWhiteSpace(HttpRuntime.AppDomainAppPath)) return baseUrl;

            var request = HttpContext.Current.Request;
            var appUrl = HttpRuntime.AppDomainAppVirtualPath;

            baseUrl = string.Format("{0}://{1}{2}", request.Url.Scheme, request.Url.Authority, appUrl);

            if (!string.IsNullOrWhiteSpace(baseUrl) && !baseUrl.EndsWith("/"))
                baseUrl = String.Format("{0}/", baseUrl);

            return baseUrl;
        }

現在、最大の問題は、スタイル シートで参照されている js ファイルと Google フォントの参照です。ここでは http または https なしで // を使用していますが、これらは http として扱われ、FireBug で混合コンテンツがブロックされたメッセージが表示されます。

この問題をどうしたら克服できるでしょうか?

ベストアンサー1

あなたが言ったように、HTTPSの終了はロードバランサーレベルで行われます(「httpsはロードバランサーレベルで設定されます」)。つまり、元のスキームではないかもしれないロードバランサーの構成に応じてサイトにアクセスします。

あなたの場合、LB は常に HTTP 経由でサイトと通信するように設定されているようです。そのため、サイトは元のスキームHttpContext.Request.RawUrl(または同様のプロパティ) を認識することはありません。

修正: 通常、LB、プロキシ、または CDN がこのように構成されている場合、元のスキームを指定する追加のヘッダーと、完全な URL、クライアントの IP などの他の受信リクエスト パラメータがありますが、これらはプロキシ デバイスの背後にあるサイトには直接表示されません。

おすすめ記事