Netlifyでデプロイしたのに反映されない・失敗するときの切り分け方
「成功」と出ているのにサイトが変わらない。この状態が一番やっかいです。原因は毎回違うのに、確認する順番は同じでした。実際に遭遇した4つの詰まり方から手順を整理します。
結論:まず「どこまで届いているか」を確定させる
デプロイが反映されないとき、いきなり原因を推測しないでください。
原因はいくつもありますが、確認する順番は毎回同じです。手前から順に、どこで止まっているかを確定させます。
| 順番 | 確認すること | 止まっていたら |
|---|---|---|
| 1 | 送信は成功したか | 権限・認証の問題 |
| 2 | 送ったファイルは正しいか | 公開フォルダの指定ミス |
| 3 | サーバーには届いているか | 反映は済んでいる(次へ) |
| 4 | 自分のブラウザで見えるか | キャッシュ |
多くの場合、原因は3と4のあいだにあります。 つまりサーバーは新しくなっているのに、自分だけ古いものを見ている状態です。
手順1:ブラウザ以外で確認する
最初にこれをやってください。 ブラウザは古い内容を保存しているので、判断材料になりません。
curl -s https://example.com | grep "確認したい文字列"
ここで新しい内容が出れば、反映は完了しています。 問題はブラウザ側です。
curl はキャッシュを持たないので、サーバーの現在の状態がそのまま見えます。
反映済みなのに見えない場合
ブラウザのキャッシュです。再読み込みではなく、キャッシュを無視した再読み込みをしてください。
| 環境 | 操作 |
|---|---|
| Mac(Chrome / Safari) | Cmd + Shift + R |
| Windows(Chrome / Edge) | Ctrl + Shift + R |
それでも変わらないときは、シークレットウィンドウで開いてください。 ここで新しければ、確実にキャッシュです。
CSSと画像は特にキャッシュが残りやすい部分です。HTMLは新しいのに見た目が古いままなら、まずCSSを疑ってください。
手順2:送ったファイルが正しいか確認する
curl でも古い内容が返るなら、送っているファイルが違う可能性があります。
一番多いのが、公開フォルダの指定ミスです。
netlify deploy --dir . --prod
この . はいま居るフォルダという意味です。1つ上の階層で実行すると、フォルダごと送られます。
その結果どうなるかというと、トップページが /site/index.html の位置に入り、https://example.com/ は404になります。
確認方法は、送る前に一覧を出すことです。
netlify deploy --dir . --dry-run
一覧の先頭が index.html になっているかを見てください。site/index.html のようにフォルダ名から始まっていたら、1階層ずれています。
消したはずのファイルが残る
Netlifyは送ったフォルダの中身で置き換えます。 手元で消したファイルは、次に送った時点でサイトからも消えます。
逆に、手元に残っている不要なファイルは公開され続けます。 「消したのに見える」場合、手元のフォルダにまだ実体があります。
私は静的サイトを生成する仕組みを自作していますが、元の原稿を消してもHTMLだけが残るという状態が起きました。生成の仕組みに、元がなくなったHTMLを自動で削除する処理を足して解決しています。
手順3:デプロイ自体が失敗している場合
コマンドがエラーで終わるときは、メッセージの種類で切り分けます。
403 が返る
権限の問題です。ファイルの中身は関係ありません。
私の環境では、--prod を付けたときだけ403になる状態が続きました。アカウント側の権限設定が原因で、コマンドや書き方をいくら変えても解決しませんでした。
回避方法があります。 いったん下書きとして送り、そのあとで本番に昇格させるという2段階に分けます。
# 1. 下書きとして送る(deploy_id が返る)
netlify deploy --dir site
# 2. その deploy を本番にする
netlify api restoreSiteDeploy --data '{"site_id":"...","deploy_id":"..."}'
やっていることは --prod と同じですが、通る経路が違うため成功します。
根本原因は解決していません。 ただ、公開できない状態が続くほうが損失が大きいので、回避策で運用しながら原因を追うという判断をしました。再現手順をメモに残しておけば、後から戻れます。
認証エラーが返る
ログインが切れています。
netlify status
これで現在のアカウントとサイトが出ます。別のアカウントになっていることもあるので、サイト名まで確認してください。
複数のサイトを扱っていると、意図しないサイトに送ってしまう事故が起きます。私は公開用のコマンドをスクリプトにまとめ、サイトIDを固定で書いておくことで防いでいます。
手順4:httpsだけ表示されない場合
HTTPでは見えるのに、HTTPSでエラーになる——これは反映の問題ではなく、証明書がまだ発行されていない状態です。
独自ドメインを設定した直後によく起きます。通常は数分から数時間で自動発行されます。
待っても発行されないときは、DNSの設定が原因です。
私が遭遇した実例では、bad dns for custom domain というエラーで止まり続けました。原因は、レンタルサーバー側にも同じドメインを登録していたことでした。
サーバー側にドメインを追加した時点で、そこにもDNSの設定が作られます。 Netlifyの設定と競合し、証明書の発行に必要な確認が通らなくなります。
登録を削除したら、すぐに発行されました。
公開先がNetlifyなら、レンタルサーバー側にドメインを追加しないでください。 詳しい経緯は独自ドメインをNetlifyに向けるときの落とし穴に書いています。
確認は次のコマンドでできます。
# 実際にどこを向いているか
dig example.com +short
# 証明書が出ているか(200なら発行済み)
curl -s -o /dev/null -w "%{http_code}\n" https://example.com
反映されない事故を防ぐ
原因を追う時間が惜しいので、送る前に自動で検査するようにしました。
私が公開前に必ず実行しているのは、次のような内容です。
| 検査 | 防げる事故 |
|---|---|
| 生成し直して差分が出ないか | 手元とサイトの食い違い |
| 公開対象の一覧を出す | 1階層ずれ・不要ファイルの混入 |
| 主要ページのリンク切れ | 404の公開 |
検査が通らなければ公開コマンドを実行しないという形にしてあります。人間が思い出して確認する方式は、急いでいるときに必ず飛ばします。
とくに「生成し直して差分が出ないか」は効きます。差分が出るなら、手元のHTMLは最新の原稿から作られていないということです。この状態で送ると、古い内容が公開されます。
よくある質問
デプロイは成功と出るのにサイトが変わりません
トップページが404になります
--prod を付けると403で失敗します
httpsでだけ表示されません
消したファイルがサイトに残っています
まとめ
- 推測する前に、curl でサーバーの現状を確認する
- 反映済みなのに見えないならキャッシュ。 シークレットウィンドウで確定できる
- トップが404なら公開フォルダの1階層ずれ。
--dry-runの先頭を見る - 403は権限の問題。 下書き→昇格の2段階で回避できることがある
- httpsだけ出ないのはDNSの競合。 サーバー側にドメインを登録しない
- 公開前の検査を自動化する。 人間の確認は急いでいるときに飛ぶ
公開手順そのものはNetlifyで静的サイトを公開する手順にまとめています。