wp core install 直後に固定ページが404になる(.htaccessが作られていない)

wp core install 直後に固定ページが404になる(.htaccessが作られていない)

wp-cli の wp core install でWordPressを設置したところ、トップページは出るのに固定ページ /about/ だけが404になりました。原因はドキュメントルートに .htaccess が作られていなかったことです。この記事では、そこに気づくまでに何を確認したかと、日本語タイトルのスラッグをどう扱ったかをまとめます。

起きたこと:トップは出るのに固定ページだけ404

wp core install でWordPressを入れて、ブラウザでトップページを開くと問題なく表示されました。ところが固定ページの /about/ にアクセスすると404が返ってきます。

この時点で分かっていた条件は次のとおりです。

  • パーマリンク設定は /%postname%/ に変更済み
  • wp rewrite flush も実行済み
  • Apache の vhost 側で AllowOverride All は設定済み

つまり「よくある原因」とされる部分は、先に全部つぶしてあった状態でした。それでも404が消えないので、しばらく設定ファイルの方ばかり見ていました。

失敗したこと

「rewrite flush したのに効かない」と思い込んで、パーマリンク設定とApacheのvhostを何度も往復して見直していました。実際に見るべきだったのは、生成されるはずのファイルが存在するかどうかでした。

原因:ドキュメントルートに .htaccess が無かった

ドキュメントルートを直接確認したところ、.htaccess が存在していませんでした。ls ではドットで始まるファイルが表示されないので、最初に見たときに気づけていませんでした。

WordPressは、パーマリンク設定を保存したり wp rewrite flush を実行したりしたときに .htaccess を書き込もうとします。ただし、書き込めなかった場合、.htaccess は作られません。そしてこのとき、コマンドはエラーで止まるわけではないため、「flush は成功した」という認識のまま先に進んでしまいます。

AllowOverride All が設定されていることと、.htaccess が存在することは別の話です。AllowOverride は「置かれていれば読む」という設定であって、ファイルを作ってくれるわけではありません。私はここを混同していて、vhost 側が正しいから .htaccess も当然あるはずだと思い込んでいました。

ポイント

固定ページだけ404になるとき、トップページが表示されるかどうかで切り分けができます。トップは出るのに個別のURLだけ404なら、リライトルールが適用されていない疑いが濃いので、設定値より先にファイルの存在を見たほうが早いです。

対処:.htaccess を手で作ったら解消した

結論としては、.htaccess を手で作成したところ404は解消しました。WordPressが自分で書けない以上、こちらで置いてしまうのが確実です。

  1. ドキュメントルートで .htaccess が存在するかを確認する(ドットファイルが見える形で確認する)
  2. 存在しなければ、WordPressのリライトルールを記述した .htaccess を手で作成する
  3. 再度 /about/ にアクセスして404が消えるか確認する
  • 手で .htaccess を置いたら /about/ が表示されるようになった
  • vhost の AllowOverride All はそのままで問題なかった
注意

今回は「書き込めなかったので作られなかった」という結果は確認できましたが、なぜ書き込めなかったのかまでは私は特定していません。所有者や権限のどこが原因だったかを詰めていないので、そこは分かっていないこととして書いておきます。手で置いて解決した状態は、裏を返せば今後もWordPress側から .htaccess を更新できない可能性が残っているということです。

もうひとつのハマりどころ:日本語タイトルのURL

パーマリンクを記事名(/%postname%/)にすると、日本語タイトルの記事ではスラッグも日本語になります。その結果、URLがエンコードされて非常に長いURLになります。

見た目が長いだけでなく、コピーして貼り付けたときに扱いづらくなります。そのため私は、投稿ごとに英語のスラッグを別途当てる運用にしました。

wp post update <id> --post_name=about-us

タイトルは日本語のまま、post_name だけを英語に上書きするやり方です。パーマリンク構造は /%postname%/ のままで、スラッグ側で調整するのがシンプルでした。

うまくいったこと

wp-cli で投稿を作った直後に wp post update <id> --post_name=... を続けて実行する流れにしておくと、日本語スラッグのまま公開してしまうのを防げます。

同じ症状のときに見る順番

確認するもの 今回の結果
パーマリンク設定 /%postname%/ に設定済み・問題なし
wp rewrite flush 実行済み・それでも404
AllowOverride All(vhost) 設定済み・問題なし
.htaccess の存在 存在しなかった(これが原因)

順番としては、設定値を疑う前にファイルがあるかを見たほうが早いというのが、今回の一番の学びでした。設定は画面やコマンドで確認できてしまう分、「やった」という記憶が残ります。一方でファイルの有無は、見に行かないと分かりません。

まとめ

  • wp core install 直後、トップは表示されるのに固定ページ /about/ が404になった
  • パーマリンクは /%postname%/、wp rewrite flush 実行済み、AllowOverride All も設定済みだった
  • 原因はドキュメントルートに .htaccess が存在しなかったこと。WordPressが書き込めなかった場合、.htaccess は作られない
  • 手で .htaccess を作成したら404は解消した
  • ただし書き込めなかった理由までは特定していない
  • 記事名パーマリンクは日本語タイトルがURLエンコードされて非常に長くなるため、wp post update <id> --post_name=... で英語スラッグを別途当てるほうがよい
広告