パーマリンク変更後に404になる原因と対処|.htaccess と mod_rewrite

結論

パーマリンクを変えた直後、トップページは表示されるのに投稿や固定ページが404になる場合、原因は次の3つに絞れます。

  1. リライトルールが更新されていない(設定 → パーマリンク で「変更を保存」を押すと直ることが多い)
  2. .htaccess が無い、または内容が壊れている
  3. サーバー側の設定(Apache の mod_rewrite が無効、AllowOverride が None)

まず「設定 → パーマリンク」を開いて保存し、それでも直らなければ .htaccess とサーバー設定を順に確認します。

原因・仕組み

公式ドキュメントによると、Apache 上の WordPress は mod_rewrite を使い、.htaccess の書き換えルールで、存在しないファイル・ディレクトリへのアクセスを index.php に回します。WordPress は、その index.php の中で、保存済みのリライトルールを参照して、URL を投稿などに対応づけます。

つまり、404 には2層あります。サーバーが index.php に回してくれない(.htaccess や Apache の問題)か、回してはいるが WordPress のルールに該当が無い(ルール未更新)かです。切り分けは、/index.php/sample-post/ のように index.php を挟んだ URL なら開けるかで確認できます。開けるなら、サーバーの書き換え機能が原因です。

手順(サンプルコード)

  1. 管理画面 → 設定 → パーマリンク → 変更を保存。
  2. 直らなければ、サイトのルートの .htaccess を確認します。標準の記述は次の通りです。
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
  1. Apache の設定で、該当ディレクトリの AllowOverride を All(少なくとも FileInfo)にし、mod_rewrite を有効にします。
  2. プラグインやテーマからルールを更新する必要がある場合は、有効化時に1回だけフラッシュします。
register_activation_hook( __FILE__, function () {
    my_register_post_types(); // 先にカスタム投稿タイプ等を登録
    flush_rewrite_rules();
} );

動作確認(検証環境と結果)

WordPress 7.1.2(ja)/PHP 8.2.12 で、$wp_rewrite にパーマリンク構造 /%postname%/ を設定し、標準の書き換えルールを出力しました(tests フォルダの p9.php)。

using_permalinks=true ; using_mod_rewrite_permalinks=true
  • 出力された .htaccess 用の記述は、上の標準例(RewriteCond による存在チェックと /index.php への書き換え)と同じ内容でした。
  • 前節のカスタムタクソノミーの検証(p3.php)では、登録直後は保存済みルールに該当 URL が無く、flush_rewrite_rules( false ) のあとに追加されました。
  • Apache でのブラウザアクセスによる404の再現と解消は、この CLI 環境では確認していません。

パーマリンク変更後に404になる原因と対処の注意点

  • flush_rewrite_rules() は処理が重く、公式リファレンスも「必要なときだけ」としています。init フックで毎回呼ぶ、フロントエンドから呼ぶ、といった使い方は避けます。
  • 引数 $hard が true(既定)のとき、.htaccess も書き換えるので、書き込み権限が必要です。
  • nginx では .htaccess は使われません。try_files $uri $uri/ /index.php?$args; のようなサーバー設定が必要です。
  • 変更前の .htaccess を必ず控えます。独自のリダイレクト記述がある場合は、# BEGIN WordPress ブロックの外に書きます。
  • CDN やキャッシュプラグインが古い404を返し続けることがあります。キャッシュを削除して再確認します。

パーマリンク変更後に404になる原因と対処でよくあるミス

  • ローカル環境で AllowOverride None のまま、パーマリンクを「投稿名」に変更する。
  • .htaccess の RewriteBase を、サブディレクトリ設置なのに / のままにする。
  • ルール更新のため、functions.php に flush_rewrite_rules() を書いて、全リクエストで実行させる。
  • カスタム投稿タイプを登録した直後に、パーマリンクを保存し忘れる。

パーマリンク変更後に404になる原因と対処のチェックリスト

  • [ ] 「設定 → パーマリンク」で保存した
  • [ ] .htaccess が存在し、標準の記述がある
  • [ ] mod_rewrite と AllowOverride が有効
  • [ ] /index.php/… 形式のURLで開けるか確認した
  • [ ] キャッシュを削除して再確認した
  • [ ] 変更前の設定を控えた

パーマリンク変更後に404になる原因と対処のFAQ(よくある質問)

Q. 保存すると .htaccess が書き換わりますか。
A. 書き込み権限があれば、WordPress が自動で更新します。権限が無いと、画面に追記すべき内容が表示されます。

Q. 一部のページだけ404になります。
A. 同じスラッグの投稿タイプやタクソノミー、固定ページが競合している可能性があります。

Q. 英数字の投稿名にしても404です。
A. ルール未更新ではなく、サーバー設定の問題が濃厚です。上の切り分けを行ってください。

筆者の見解(パーマリンク変更後に404になる原因と対処)

パーマリンクの404は、WordPress 側とサーバー側のどちらの問題かを最初に切り分けると、迷いにくいと考えています。私見では、/index.php/ 付きの URL で開けるかを確認するだけで、調査範囲を大きく絞れます。恒久的な対処は設定やバックアップの手順として残しておくと、移転時にも役立ちます。

パーマリンク変更後に404になる原因と対処の関連項目

出典(一次情報)

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