2026年10月15日

2026年10月15日

WordPressのパーマリンクが壊れた・変更できない問題を解決する方法

はじめに

WordPressのパーマリンクが突然機能しなくなったり、設定を変更しても反映されない場合、.htaccessファイルの書き込み権限やmod_rewriteモジュールの無効化が原因であることがほとんどです。

症状・原因

  • パーマリンク設定を保存しても404エラーが解消しない
  • カスタムパーマリンク(/%postname%/など)に変更すると全ページが404になる
  • 管理画面の「パーマリンク設定」ページを開くと.htaccessに書き込めないという警告が出る
  • プラグインや子テーマの追加後からパーマリンクが壊れた

解決手順

ステップ1:パーマリンクを手動でリセットする

# WP-CLI でパーマリンクをフラッシュ(最も確実な方法)
wp rewrite flush --hard

# パーマリンク構造を確認
wp option get permalink_structure

# パーマリンク構造を設定(空の場合)
wp option update permalink_structure '/%postname%/'

# フラッシュ後の状態を確認
wp rewrite list --format=table
管理画面からリセットする手順:
1. 設定 → パーマリンク設定
2. 「基本」(?p=123 形式)を選択して「変更を保存」
3. 再度「投稿名」などの目的の設定を選択して「変更を保存」
   → 2回保存することで .htaccess を確実に再生成できる

ステップ2:.htaccess を確認・修正する

# .htaccess の存在と内容を確認
cat /var/www/html/.htaccess

# .htaccess の書き込み権限を確認(664 または 644 が必要)
ls -la /var/www/html/.htaccess

# 書き込み権限を付与
chmod 664 /var/www/html/.htaccess

# WordPressが .htaccess を書き込めるよう所有者を変更
chown www-data:www-data /var/www/html/.htaccess
# .htaccess に以下の内容が含まれているか確認・追記
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

ステップ3:mod_rewrite を有効化する(Apache)

# mod_rewrite が有効か確認
apache2ctl -M | grep rewrite
# "rewrite_module (shared)" と表示されれば有効

# mod_rewrite を有効化(Ubuntu/Debian)
a2enmod rewrite
systemctl reload apache2

# .conf ファイルで AllowOverride All を確認
# /etc/apache2/sites-available/000-default.conf または
# /etc/apache2/apache2.conf の <Directory> セクション
# /etc/apache2/sites-available/example.com.conf
<VirtualHost *:80>
    DocumentRoot /var/www/html
    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All        # ← これが None になっていると .htaccess が無効
        Require all granted
    </Directory>
</VirtualHost>
# 設定を変更したら Apache を再起動
apache2ctl configtest && systemctl reload apache2

ステップ4:Nginx の場合は try_files を設定する

# Nginx では .htaccess は使えない
# /etc/nginx/sites-available/example.com に try_files を設定

server {
    root /var/www/html;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;  # ← この行がないと404になる
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}
# Nginx の設定を確認して反映
nginx -t && systemctl reload nginx

ステップ5:プラグイン競合によるパーマリンク破損を修復する

# プラグインを全て無効化してパーマリンクをリセット
wp plugin deactivate --all
wp rewrite flush --hard

# 動作確認後、プラグインを1つずつ有効化
wp plugin activate plugin-name
wp rewrite flush --hard
# パーマリンクが壊れるプラグインを特定する

# 競合するプラグインのリライトルールを確認
wp rewrite list --format=table | head -30
// functions.php: プラグインが登録したリライトルールをデバッグ
add_action('init', function(): void {
    if (isset($_GET['debug_rewrite']) && current_user_can('administrator')) {
        global $wp_rewrite;
        var_dump($wp_rewrite->rules);
        exit;
    }
});
// アクセス: https://example.com/?debug_rewrite=1

注意事項

  • .htaccessを手動で編集する際は、# BEGIN WordPressから# END WordPressまでの範囲を丸ごと置き換えてください。この範囲はWordPressが自動管理するため、手動変更は上書きされる場合があります
  • Nginxを使っている場合は.htaccessは機能しません。Nginxの設定ファイルにtry_files $uri $uri/ /index.php?$args;を追加する必要があります
  • マルチサイトの場合はパーマリンクルールが異なります。サブディレクトリ型とサブドメイン型でそれぞれ異なる.htaccess設定が必要です

まとめ

パーマリンク破損の解決は①wp rewrite flush --hardでパーマリンクと.htaccessを強制再生成、②.htaccessにRewriteEngine On / RewriteBase / / try_filesの標準設定があるか確認・手動追記、③a2enmod rewriteでmod_rewriteを有効化しAllowOverride AllをVirtualHost設定に追記、④Nginxの場合はtry_files $uri $uri/ /index.php?$argsをlocationブロックに設定、⑤wp plugin deactivate --all→1つずつ有効化でリライトルールの競合プラグインを特定します。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲