【PowerShell】簡易HTTPサーバを構築する


この記事はプロモーションを含みます。

PowerShell

ホーム > PowerShell 逆引きリファレンス

PowerShellのみでローカルで動作する簡易HTTPサーバを構築する方法を紹介します。
HttpListener を利用して index.html を配信するサンプルです。

はじめに

ローカルでHTMLを素早く確認したいとき、わざわざWebサーバをインストールするのは少し面倒です。
そんなときは PowerShell の HttpListener を利用すると、数行のスクリプトだけで簡易HTTPサーバを起動できます。

今回紹介するスクリプトでは、localhost:8888 で待ち受けを行い、カレントディレクトリに配置した index.html をブラウザへ返却します。

動作の流れは非常にシンプルで、簡易的なローカル検証用途であれば十分使える構成です。

  • HttpListener を生成
  • ポート 8888 で待ち受け
  • index.html を読み込み
  • HTMLをレスポンスとして返却
  • ファイルが存在しない場合は 404 を返す

接続方法

起動後はブラウザで以下URLへアクセスするだけです。

http://localhost:8888

本記事のソースコードをそのまま使用した場合、
サーバ起動状態でブラウザに接続すると「サーバ稼働中」と表示されます。

ソースコード(サーバ起動用PowerShell)

$listener = New-Object System.Net.HttpListener
$listener.Prefixes.Add("http://localhost:8888/")
$listener.Start()

Write-Host "http://localhost:8888"

while ($true) {
    $context = $listener.GetContext()

    $path = Join-Path (Get-Location) "index.html"

    if (Test-Path $path) {
        $bytes = [System.IO.File]::ReadAllBytes($path)
        $context.Response.ContentType = "text/html"
        $context.Response.OutputStream.Write($bytes, 0, $bytes.Length)
    } else {
        $context.Response.StatusCode = 404
    }

    $context.Response.Close()
}

こちらのコードでは、ポート番号が「8888」となっていますが、
既に使用している場合は別の番号に変えてください。

ソースコード(動作確認用HTML)

ファイル名は「index.html」、文字コードはUTF-8で作成し、PowerShellと同じフォルダに格納してください。

<!doctype html>
<html lang="ja">
<head>
  <meta charset="utf-8" />
  <title>サーバ接続テスト</title>
</head>
<body>
  <h1>ローカルサーバテスト</h1>
  <p id="status">確認中...</p>

  <script>
    async function checkServer() {
      try {
        const res = await fetch("/health", { cache: "no-store" });

        if (res.ok) {
          document.getElementById("status").textContent =
            "サーバ稼働中";
        } else {
          throw new Error("not ok");
        }
      } catch (e) {
        document.getElementById("status").textContent =
          "サーバに接続できません";
      }
    }

    checkServer();
  </script>
</body>
</html>

PowerShellが実行できない場合

PowerShellの実行時にエラーが出る場合は、下記を参考にしてみてください。

コメント

タイトルとURLをコピーしました