WordPressサイトでmod_rewriteを設定した際、意図せず301リダイレクトが発生してしまうときの原因と対処法をご紹介します。
目次
発生した事象とやりたかったこと
まず、どのような状況で問題が発生し、何を達成したかったのかをご紹介します。
実行環境と前提
- サーバー: エックスサーバー
- 構成: ルートディレクトリとサブディレクトリ、それぞれにWordPressをインストール
ディレクトリ構成は以下の通りです。
.public_html
├── WordPressのファイル
└── sub-dir
└── WordPressのファイル
やりたかったこと
ルートディレクトリのWordPressサイトにおいて、特定のURL(https://example.com/page
)にアクセスがあった際、URLは変更せずにサブディレクトリのWordPressサイトの特定のページ(https://example.com/sub-dir/page
)の内容を表示させること。
設定した.htaccess
ルートディレクトリの.htaccessに、以下のmod_rewriteルールを記述しました。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^page$ /sub-dir/page [L]
</IfModule>
発生した問題
https://example.com/page
にアクセスしたところ、mod_rewriteではなくWordPressによって、https://example.com/sub-dir/page
へ301リダイレクトされてしまいました。
以下のcurl
コマンドの結果でも、WordPressがリダイレクトを指示していることが確認できます。
% curl -I https://example.com/page
HTTP/2 301
...
location: https://example.com/sub-dir/page
...
x-redirect-by: WordPress
301リダイレクトの原因と対処法
この301リダイレクトが発生した原因と、解決策について解説します。
原因:プラグイン「Custom Permalinks」
今回のケースでは、サブディレクトリのWordPressで利用していたプラグイン「Custom Permalinks」が原因でした。
このプラグインは、任意のページに独自のパーマリンクを設定できる便利なツールです。しかし、このプラグインが設定したパーマリンク(https://example.com/sub-dir/page
)が、ルートディレクトリの.htaccessに記述したmod_rewriteルールよりも優先して動作していたため、意図しないリダイレクトが引き起こされていたようです。
x-redirect-by: WordPress
というヘッダー情報からも、WordPress自体がリダイレクト処理を行っていることが分かります。mod_rewriteの[L]
フラグ(Last ruleの意)は、該当のルールがマッチしたらそれ以降のルールを適用しないという意味ですが、WordPressのリダイレクト処理は、mod_rewriteの処理よりも後に行われるため、このルールは無視されてしまいました。
対処法
Custom Permalinksによるパーマリンク設定を削除し、WordPressの標準機能で設定し直すことで解決しました。
- Custom Permalinksの設定を削除:
サブディレクトリのWordPressにログインし、「Custom Permalinks」で設定していたパーマリンク設定を削除します。 - WordPressの標準機能で再設定:
パーマリンク設定を削除した後、WordPressの標準機能で改めてパーマリンクを設定し直します。 - .htaccessの確認:
最後に、ルートディレクトリの.htaccessに、前述のmod_rewriteルールが正しく記述されているかを確認します。
修正後の結果
これらの手順を実行した結果、https://example.com/page
にアクセスした際に301リダイレクトは発生せず、URLを変更することなく、サブディレクトリのページが表示されるようになりました。
curl
コマンドで確認すると、HTTP/2 200
が返されていることが分かります。
% curl -I https://example.com/page
HTTP/2 200
...
まとめ
WordPressサイトでmod_rewriteを設定したのに意図した通りに動かず、x-redirect-by: WordPress
による301リダイレクトが発生する場合は、パーマリンク設定を行うプラグインが原因となっている可能性があります。
mod_rewriteの処理よりもWordPress自体のパーマリンク設定が優先されることがあるため、プラグインやWordPressの標準設定をもう一度確認してみることをおすすめします。
弊社ではウェブサイトの制作や保守を行っています。ぜひお気軽にご相談ください。