SharePoint Server におけるホストヘッダーの利用について

こんにちは SharePoint サポートの森 健吾 (kenmori) です。

今回の投稿では、SharePoint Server オンプレミス製品をホストする Web サーバーでホスト ヘッダーを利用する方法や注意点についてご説明します。
新しい情報ではありませんが、代替アクセス マッピングと合わせて質問が多いため、今回情報を公開させていただくに至りました。

なお、ホストヘッダーは、SharePoint Server 2013 から導入されたホスト名付きサイト コレクションには対応していません。本投稿ではホスト名付きサイト コレクションには言及しません。

 

ホストヘッダーの用途

ホストヘッダーを指定すれば、要求アドレスのホスト名をもとに、Web サーバーが到達先の Web サイトを振り分けることができるようになります。そのため、例えば複数の異なる IIS Web サイト (または異なる SharePoint の Web アプリケーション) で同じポート番号 (例. 80, 443) を共有することが可能になります。

ホストヘッダーを指定した場合、HTTP 要求されたアドレスのホスト名とポート番号の両方が合致した Web サイトに要求が振り分けられます。

hostheader1

この機能が利用される背景としては、Web サーバーにおいて、特に 80 番ポート (https://)や 443 番ポート (https://) など、URL 表記する際に番号を省略できるポートであるということ。また、ファイアウォール設定などもあるため、あまり多くのポートを開けたくないという要件などもあります。

SharePoint でホストヘッダーを設定できる画面は、新規 Web アプリケーションを作成画面か、Web アプリケーションの拡張画面のみです。

その他の画面で、ホストヘッダーの設定値を変更や参照する画面は用意されていません。(*1) hostheader3 hostheader4

IIS においてホストヘッダーを設定するのは、下記画面の通り、サイトバインドのホスト名が該当します。

hostheader2

上記の通り、IIS 管理コンソールでサイトのホスト ヘッダーの設定値を参照することは可能ですが、SharePoint は製品として直接 IIS 管理コンソールからサイトのバインドを変更し、ホストヘッダーを指定することを想定しておりません。

もちろん、IIS を基盤にして動作する以上、IIS でサイト バインドを設定するだけで要求の振り分けは可能です。しかし、IIS での設定変更は、構成データベースに格納されませんので、IIS 設定と SharePoint 製品の構成データとの間にかい離が生じます。

このことから、SharePoint 全体管理画面でのオペレーションや PowerShell による管理コマンドの実行時等で、構成データの値に基づき、設定内容が意図せず元に戻ることが想定されます。

また、新しくホストヘッダーを登録する場合や SharePoint ホスト アドインの構築など、製品動作として IIS のバインドを変更する処理はいくつかあります。これらの制御を行うにあたり、構成データベースに設定が格納されていなければ、ホストヘッダーが登録されている前提を考慮した動作ができませんので、様々なシナリオで構成上の不整合を引き起こし、Web サイトにアクセスできなくなる (404 エラー) などの現象発生が想定されます。

 

補足 (*1) ホストヘッダーを確認する方法

SharePoint 全体管理画面でホスト ヘッダーを画面上から確認する方法はありません。IIS 管理コンソールから Web サイトのバインドを確認する方法もありますが、整合性が気になるとお考えの方は、PowerShell を使ってホストヘッダーを照会する方法が有効です。

下記にファーム全体の Web アプリケーション全体における IIS のバインド設定を確認するための PowerShell を用意しましたので、これをお役立ていただけますと幸いです。

 

 $global:SPBindings = [System.Collections.ArrayList]@()

function GetBindings($webappurl, $key, $bindings)
{
  foreach ($binding in $bindings)
  {
    $bindtoadd = new-object psobject -property ([ordered]@{WebApplication = $webappurl; Zone = $key; HostHeader = $binding.HostHeader; Port =
$binding.Port})
    [void]$global:SPBindings.add($bindtoadd)
  }
}

foreach ($webApp in (Get-SPWebApplication))
{
  foreach ($key in $webApp.IisSettings.Keys)
  {
    GetBindings -webappurl $webApp.Url -key $key -bindings $webApp.IisSettings[$key].ServerBindings
    GetBindings -webappurl $webApp.Url -key $key -bindings $webApp.IisSettings[$key].SecureBindings
  }
}
$global:SPBindings | select WebApplication, Zone, HostHeader, Port

上記のスクリプトを GetSPBindings.ps1 として保存し、SharePoint 管理シェルで実行します。

 PS>.\GetSPBindings.ps1

なお、取得する $SPBindings をグローバル スコープの変数として定義しておりますので、本スクリプト実行後の同じ PowerShell ウインドウで $SPBindings を参照すれば結果が取得できるようにしています。

さらに $SPBindings | fl のようにすることも可能ですし、フィルターやソートなども可能ですので、ご自由に使ってみてください。

タイトル : SPSecureBinding class
アドレス : https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spsecurebinding(v=office.15).aspx

タイトル : SPServerBinding class
アドレス : https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spserverbinding.aspx

タイトル : SPIisSettings class
アドレス : https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spiissettings.aspx

タイトル : SharePoint Server で PowerShell を使用する際の準備事項
アドレス : https://blogs.technet.microsoft.com/sharepoint_support/2013/10/04/sharepoint-server-powershell/

 

その他 : 代替アクセス マッピング (AAM) との違いについて

別の Web アプリケーション (例. SharePoint – 8080) の代替アクセス マッピングに、80番ポートのアドレス (例. https://www.sharepoint.com)を登録することでも、動作上同様の構成を実現できているように見えます。

hostheader5

しかし、上記の図に記載の通り IIS はポート番号で要求を振り分けています。その上で、80 番ポートのサイト内で処理が実行され、SharePoint のモジュールが代替アクセス マッピングのテーブルを参照して適切な Web サイトを探し出し、要求を対象の 8080 番ポートの Web サイトに転送します。そして、転送先の 8080 番の Web サイトが実際の処理を行います。

この構成は、双方の Web サイトに全ユーザーから毎回アクセスされる形となるため非効率です。IIS ログを確認すると、両方の Web サイトにログが記録されることが確認できます。

このような理由で、複数の Web アプリケーション間で同じポートを共有するよう構成するにあたり、ホストヘッダーではなく、代わりに代替アクセス マッピングを使うことは推奨しておりません。

それぞれの役割をあらためてまとめると以下のようになります。
・ホストヘッダーは、SharePoint Web フロント エンド サーバーに到達する HTTP を、各 IIS Web サイトに振り分けるための機能。
・代替アクセス マッピングは、Web アプリケーションが HTTP を受けるアドレスを管理する機能。

上記のように、別のものとして理解することが一般的となります。代替アクセス マッピングにつきましては、合わせて過去のブログ記事もご参考にしてください。

タイトル : 代替アクセス マッピングを理解する
アドレス : https://blogs.technet.microsoft.com/sharepoint_support/2015/09/15/4401/

以上の通りお伝えいたします。