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_expiresとmod_deflateで静的ファイルのブラウザキャッシュとgzip圧縮を設定します。