私は新しい負荷分散ステージングサイトをテストしており、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 などの他の受信リクエスト パラメータがありますが、これらはプロキシ デバイスの背後にあるサイトには直接表示されません。