Nginxで/index.htmlを/にリダイレクトする正しい方法
無限ループ地獄から脱出するまでの完全ガイド
⚠️ よくあるトラブル
「このページは動作していません。リダイレクトが繰り返し行われました」というエラーに悩まされていませんか?この記事で解決します。
結論
server {
listen 80;
server_name example.com www.example.com;
root /var/www/html; # 重要:これがないとダメ
location = /index.html {
return 301 /;
}
location = / {
try_files /index.html =404;
}
location / {
try_files $uri $uri/ =404;
}
}
なぜ無限ループが起きるのか
間違った設定例
location = /index.html {
return 301 /;
}
location / {
root /var/www/html;
try_files $uri $uri/ =404;
}
無限ループの流れ:
/にアクセス- Nginxが自動的に
index.htmlを探す(デフォルト動作) /index.htmlとして処理されるlocation = /index.htmlにマッチして/にリダイレクト- ①に戻る → 無限ループ
正しい設定
location = /index.html {
return 301 /;
}
location = / {
try_files /index.html =404;
}
location / {
try_files $uri $uri/ =404;
}
ポイント:
location = /で完全一致を明示的に指定try_files /index.htmlで直接ファイルを指定- Nginxの自動 index 検索を回避
ハマりやすいミス3選
1. root ディレクティブの指定忘れ
これがないと「welcome to nginx」のデフォルトページが表示されます。必ず root /var/www/html; をサーバーブロックに追加してください。
2. location / と location = / の違い
location / は前方一致、location = / は完全一致。リダイレクトには完全一致が必須です。
3. index ディレクティブの自動動作
Nginxはデフォルトで / へのアクセス時に自動的に index.html を探します。これを location = / で上書きする必要があります。
実装手順
Step 1: 設定ファイルを編集
sudo nano /etc/nginx/sites-available/your-site
Step 2: 以下の設定を記述
server {
listen 80;
server_name example.com www.example.com;
root /var/www/html;
location = /index.html {
return 301 /;
}
location = / {
try_files /index.html =404;
}
location / {
try_files $uri $uri/ =404;
}
}
Step 3: 設定をテスト
sudo nginx -t
Step 4: Nginxを再起動
sudo systemctl reload nginx
動作確認方法
- ブラウザで
http://example.com/にアクセス → サイトが正常に表示されればOK - ブラウザで
http://example.com/index.htmlにアクセス →http://example.com/にリダイレクトされればOK - 開発者ツール(F12)のNetworkタブで確認 → 301リダイレクトが表示されればOK
SEO的な補足
301リダイレクトは「恒久的な移転」を意味し、SEO評価を引き継ぎます。
さらに、HTMLの <head> 内に canonical タグを追加すると完璧です:
<link rel=”canonical” href=”http://example.com/” />
トラブルシューティング
「welcome to nginx」が表示される
原因:デフォルト設定が優先されている、または root が指定されていない
解決方法:
sudo rm /etc/nginx/sites-enabled/default
sudo systemctl reload nginx
sudo systemctl reload nginx
「nginx: [emerg] 」エラーが出る
原因:設定ファイルの構文エラー(閉じカッコ忘れなど)
解決方法:
sudo nginx -t
でエラー箇所を確認し、各 location ブロックの } が正しく閉じられているか確認してください。
それでもリダイレクトループする
確認ポイント:
location = /が正しく記述されているかtry_files /index.html =404;になっているか($uriではない)- 他の設定ファイルと競合していないか
- ブラウザのキャッシュをクリアしたか
まとめ
rootディレクティブは必須location = /で完全一致を明示try_files /index.htmlで直接指定- 設定後は必ず
nginx -tでテスト
この設定で、SEO的にも正しい301リダイレクトが実現できます。
