2026年5月20日

2026年5月20日

WordPressの.htaccessを正しく設定する方法

はじめに

.htaccess はApacheサーバーのディレクトリレベルの設定ファイルです。WordPressのパーマリンク機能はこのファイルに依存しており、正しく設定されていないとURLが404エラーになります。パーマリンク設定からセキュリティ強化・パフォーマンス改善まで体系的に解説します。

症状・原因

  • 投稿URLが404になる(.htaccessの書き込み権限がない)
  • 旧URLへのアクセスが新URLにリダイレクトされない
  • www有りと無しが混在している
  • 管理画面からパーマリンク設定を保存できない

解決手順

ステップ1:WordPressの基本.htaccessを確認する

# WordPress標準の.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
# .htaccessが存在しない・パーマリンクが壊れた場合

# WP-CLIで.htaccessを再生成
wp rewrite flush --hard

# .htaccessのパーミッション確認
ls -la /var/www/html/.htaccess
# 644が正常、Webサーバーユーザーのオーナー確認

# 書き込み権限を設定
chown www-data:www-data /var/www/html/.htaccess
chmod 644 /var/www/html/.htaccess

ステップ2:リダイレクトを設定する

# .htaccess: よく使うリダイレクト設定

<IfModule mod_rewrite.c>
RewriteEngine On

# HTTP → HTTPS へのリダイレクト
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# www なし → www あり(またはその逆)
# www なし統一の場合:
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

# 特定ページのリダイレクト
Redirect 301 /old-page/ https://example.com/new-page/

# 旧カテゴリURLの一括リダイレクト
RedirectMatch 301 ^/category/old-cat/(.*)$ https://example.com/new-cat/$1

# 末尾スラッシュの統一(スラッシュあり → なし)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(.+)/$
RewriteRule ^(.+)/$ /$1 [R=301,L]

</IfModule>

ステップ3:セキュリティ設定を追加する

# .htaccess: セキュリティ強化

# wp-config.php へのWebアクセスをブロック
<Files wp-config.php>
    Order Deny,Allow
    Deny from all
</Files>

# .htaccess 自体へのアクセスをブロック
<Files .htaccess>
    Order Deny,Allow
    Deny from all
</Files>

# xmlrpc.php へのアクセスをブロック
<Files xmlrpc.php>
    Order Deny,Allow
    Deny from all
</Files>

# ディレクトリ一覧を無効化
Options -Indexes

# PHPファイルの実行を特定ディレクトリで禁止
<Directory /var/www/html/wp-content/uploads>
    <FilesMatch "\.php$">
        Order Deny,Allow
        Deny from all
    </FilesMatch>
</Directory>

# 不審なUser-Agentをブロック
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (libwww-perl|wget|python|nikto|scan) [NC]
RewriteRule .* - [F,L]

# ホットリンク(画像直リン)を防止
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.com [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp)$ - [F]

ステップ4:パフォーマンス設定を追加する

# .htaccess: ブラウザキャッシュ・gzip・Expires

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType text/html                 "access plus 0 seconds"
    ExpiresByType text/css                  "access plus 1 year"
    ExpiresByType application/javascript    "access plus 1 year"
    ExpiresByType image/jpeg                "access plus 1 year"
    ExpiresByType image/png                 "access plus 1 year"
    ExpiresByType image/webp                "access plus 1 year"
    ExpiresByType image/svg+xml             "access plus 1 year"
    ExpiresByType font/woff2                "access plus 1 year"
    ExpiresByType application/pdf           "access plus 1 month"
</IfModule>

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/css
    AddOutputFilterByType DEFLATE application/javascript application/json
    AddOutputFilterByType DEFLATE image/svg+xml application/xml
    AddOutputFilterByType DEFLATE font/woff font/woff2
</IfModule>

# Cache-Control ヘッダー
<IfModule mod_headers.c>
    <FilesMatch "\.(css|js|jpg|jpeg|png|gif|webp|woff2)$">
        Header set Cache-Control "max-age=31536000, public, immutable"
    </FilesMatch>
    <FilesMatch "\.html$">
        Header set Cache-Control "no-cache, must-revalidate"
    </FilesMatch>
</IfModule>

ステップ5:.htaccessの構文を確認する

# Apache構文チェック(設定ミスを事前に検出)
apachectl configtest

# または
apache2ctl -t

# .htaccess の構文チェック(Apache 2.4+)
apachectl -t -D DUMP_VHOSTS

# エラーログで.htaccessエラーを確認
tail -f /var/log/apache2/error.log | grep "htaccess"

# .htaccessが有効か確認(AllowOverride設定)
apache2ctl -M | grep rewrite  # mod_rewriteが有効か

注意事項

  • .htaccess の構文エラーは500エラーを引き起こします。変更前に必ずバックアップを取り、apachectl configtest で構文を確認してください
  • Nginxサーバーでは .htaccess は機能しません。Nginxの場合は nginx.conf または server ブロックの設定ファイルに同等の設定を記述します
  • AllowOverride None が設定されている場合、.htaccess が無視されます。ホスティングのApache設定を確認してください

まとめ

パーマリンクが壊れた場合は wp rewrite flush --hard.htaccessを再生成します。HTTP→HTTPS・www統一・旧URLのリダイレクトはmod_rewriteで実装します。セキュリティはwp-config.php・xmlrpc.php・uploadsのPHP実行禁止を.htaccessでブロックします。パフォーマンスはmod_expiresmod_deflateで静的ファイルのブラウザキャッシュとgzip圧縮を設定します。

お気軽にご相談ください

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