猫の手ツール

Step 2: Browser & SPA

13. Astroの静的ホスティング:HTMLの配信と404・更新の確認

このプロジェクトはAstroでURLごとのHTMLを生成し、画像加工はブラウザのJavaScriptで行います。静的ホスティングでは、ビルドしたファイルを配信します。まずローカルのビルドとプレビュー、次に公開先のURL応答を別々に確認します。

1. 静的ホスティングとは何か?

これまでのWeb開発では、Webサイトを公開するために「Webサーバー(ApacheやNginx)」を自ら構築し、運用するのが一般的でした。しかし、静的ホスティング(Cloudflare Pages, Vercel, Netlifyなど)は、私たちがビルドしたHTML/CSS/JSといった「静的ファイル」を直接預かり、世界中のエッジサーバー(CDN)を通じて配信してくれるサービスです。

「猫の手ツール」はAstroでURLごとのHTMLを生成する構成です。画像加工はブラウザのJavaScriptで動きますが、サイト全体を1枚のHTMLで扱うSPAとは区別できます。静的ホスティングは、こうした複数HTMLのサイトにも利用できます。

2. メンテナンスからの解放:Before / After

インフラエンジニアの視点で、従来のサーバー運用とモダンな静的ホスティングを比較してみます。

【Before】従来のVPS/専用サーバー運用

# OSのアップデートとパッチ適用
sudo apt update && sudo apt upgrade

# Nginxの設定ファイルを編集してSSL証明書(Certbot)を更新
sudo nano /etc/nginx/sites-available/default
sudo certbot renew --nginx

# サーバーの死活監視と負荷に応じたリソース調整が必要

【After】静的ホスティング(Cloudflare Pagesなど)

# Git連携・ビルドコマンド・出力ディレクトリを設定済みの場合
git add .
git commit -m "Add new feature"
git push origin main

# 1. 自動的にビルドが開始される
# 2. ビルド成功後、ホスティング側の配信手順に従って公開される
# 3. SSL証明書も自動で維持される

3. 静的配信の利点と管理の範囲

単に「楽だから」という理由だけではありません。静的ホスティングには技術的に非常に優れた側面が3つあります。

  • 配信負荷の分散: CDNに配信を任せることで、自前の1台へアクセスが集中する構成を避けられます。ただし配信サービスの障害、利用上限、外部APIの停止は起こり得るため、無停止の保証ではありません。
  • 運用費の見通し: 無料枠があるサービスもありますが、転送量、ビルド回数、独自ドメインや追加機能の費用はサービスごとに確認します。利用条件は変わるため、公開時の料金表を基準にします。
  • 強固なセキュリティ: サーバーサイドに動的なロジック(PHPやRubyなど)が存在しないため、自前のアプリサーバーがSQLやOSコマンドを実行する入口を減らせます。ただし、外部API、配信するJavaScript、依存パッケージ、管理アカウントの保護は別途必要です。

4. 注意点:初心者がハマる「SPAの404エラー」

クライアント側でURLを切り替えるSPAでは、画面内の移動では動くのに、そのURLへ直接アクセスすると404になる場合があります。

SPAではJavaScriptがルーティング(画面遷移)を制御しているため、/notes/page1 のようなURLでブラウザの更新ボタンを押すと、ホスティングサーバーは実在しないディレクトリを探しに行き、エラーを返してしまいます。

SPAではアプリのルートに限って入口のHTMLへ書き換える設定を使う場合があります。URLを変えるリダイレクトと、URLを保つ内部書き換えは別です。AstroでページごとのHTMLを生成するサイトでは、存在するHTMLを配信し、存在しないURLには404を返す構成を基本にします。すべてをトップへ書き換えると、存在しない記事でも正常応答になってしまいます。

公開前に確認する3種類のURL

  • 実在する記事:直接開いて正しい本文が表示され、HTTP 200になるか。
  • 移転した記事:対応する新URLへ恒久転送し、転送がループしないか。
  • 存在しない記事:トップページを200で返さず、404ページとHTTP 404を返すか。

HTMLを生成できることと、公開先がそのURLをどう返すかは別の確認です。Cloudflare Pagesなどの既定動作もサービスごとに異なるため、配信設定と実際の応答を両方調べます。

このプロジェクトの公開対象は、Astroのビルド結果

確認した採用版はAstro 6.0.7です。package.jsonのbuildはastro build、previewはastro previewを実行します。設定にはサイトのドメインとサイトマップ生成があり、公開先用のサーバーアダプターは設定していません。これは採用設定の確認で、公開サービスの管理画面を検証したという意味ではありません。

npm.cmd run build
npm.cmd run preview

プロジェクトのフォルダーでビルドを行い、成功後にターミナルへ表示されるプレビューURLを開きます。例えば画像変換ツールも、URL用のHTMLとブラウザ側の処理を配信します。画像を変換する専用サーバーが必要になる構成ではありません。画像変換の制作解説で入力から保存まで確認できます。

5. まとめ:実務でどう役立っているか

ブラウザ側の画像処理と静的配信を分けると、公開するものはHTML・JavaScript・CSSなどのファイルになります。配信の設定、依存パッケージ、公開権限を管理する作業は残ります。

静的配信でもドメイン、公開権限、ソースコード、依存ライブラリは管理対象です。ビルドの成功と、公開先で期待するURLが返ることを別々に確認します。

参考資料

既定の出力はdistです。公開先へ渡すディレクトリとビルドコマンドは、Astro公式の公開ガイド(英語)(別タブで開く)で確認します。Cloudflare Pagesを選ぶ例ではCloudflare公式のAstro設定(英語)(別タブで開く)にnpm run buildとdistが示されています。Git連携や本番ブランチは公開先で設定する条件で、このソースから確認できる内容とは区別します。

制作時に確かめたこと

ツールを作る途中で実際に確認した症状と、変更を選んだ経緯です。日付は当時の記録日です。現在の実装や、このページの学習サンプルの検証とは分けて読んでください。

Astroへの移行で、動けば完了とは言えなかった

共通化でメニューや注意書きが消えた

独立したHTMLの左メニューを一元管理するため、Astroへの変換を始めました。しかし生成された版では、元よりメニュー項目が減り、ツールの注意書きや規定が表示されず、本文の文言やレイアウトまで変わりました。

作り直しを依頼しても違いが残ったため、全コードを再生成する依頼から「元HTMLのどこを変えるか、変更点だけ教えてほしい」という依頼へ切り替えました。共通部品に置き換える作業では、ビルドの成否に加え、元のメニュー・操作・注意書きが残るかを比較する必要があります。

アダプター追加後は、出力先も変わった

3月27日にはCloudflare Workersを使用中と説明し、Cloudflareアダプターを追加した後、ビルド結果がclientとserverのフォルダーに分かれたと報告しています。outputをstaticへ変えても、以前と同じ出力構成には戻らない状態でした。

8月25日には「Cloudflare Pagesで完全静的」と説明しています。ただし、この記録から移行日や3月の問題を直した単独の手順までは特定できません。現在の記事は現行設定を基準にし、当時のアダプター付き構成と区別しています。

内部資料のREADMEまでページになった

READMEを内部資料として使うつもりで、ツールのindex.astroと同じフォルダーへ置いたところ、ビルドでreadme/index.htmlが生成され、サイトマップにも載りました。HTMLへ取り込まない意図を持っていても、配置場所がページ生成の対象なら公開URLになる、という失敗です。

Astroのページ生成対象と、外へ配信するpublicのファイルは、内部メモの保管先と分けます。公開前はソースの一覧だけでなく、生成HTMLとサイトマップにも意図しない資料がないかを確認します。

URLの修正と検索登録は、別の確認だった

99ツール一覧を別URLへ移した後、canonicalが旧URLのままと気づきました。修正から半日経っても未登録という報告があるため、修正を実施したことと検索へ登録されたことを同じ成功扱いにはできません。

別の例ではrobots.txtのSitemap行へMarkdownのリンク表記を入れ、6月8日にSearch Consoleから構文エラーを指摘されました。括弧を含む記事用リンクと、設定ファイルが求めるURLの書き方を分ける必要があります。この不備を広告審査に落ちた原因と断定する根拠はありません。

仕様の確認:Astro公式:ページとファイルベースのルーティング(別タブ)