WordPressでパーマリンク設定をデフォルトから変更したあと、投稿ページにアクセスすると「404 Not Found」と表示されアクセスできなくなることがあります。パーマリンク設定をデフォルトに戻すと表示できる場合、これはApacheのmod_rewriteモジュールがおそらく原因でしょう。ここではこの問題の解消方法を紹介します。
WordPressでのmod_rewriteモジュールの役割
Apacheのmod_rewriteモジュールはURLの書き換えやリダイレクトを行うために使われるモジュールです。WordPressではパーマリンクの書き換えにmod_rewriteモジュールを使用しています。
WordPressのデフォルトのパーマリンク設定は例えば次のように「?p=」の後に数字が続いたものです。
http://example.com/blog/?p=123
このパーマリンクを「投稿名」を使う次のようなURLに変更したとします。
http://example.com/blog/sample-post/
このような変更を行った後、Webブラウザで「http://example.com/blog/sample-post/」にアクセスすると、mod_rewriteによってURLが書き換えられ、内部的には「http://example.com/?p=123」でアクセスが行われます。パーマリンク設定を変更するとWebページにアクセスできなくということは、この書き換えによるアクセスがうまくいってないということになります。
mod_rewriteモジュールがロードされているか確認する
mod_rewriteモジュールを利用するには、このモジュールがApacheにロードされている必要があります。Apacheにロードされているかは次のコマンドで確認できます。これらのコマンドはApacheにロードされているモジュールを一覧表示します。
# httpd -M
または
# apachectl -M
表示結果に次の行があればmod_rewriteモジュールがロードされています。
rewrite_module (shared)
上記の表示がない場合はApacheの設定を確認します。/etc/httpd/conf/httpd.confに次の行があるか確認しましょう。コメントアウトされている場合はコメントを外します。
LoadModule rewrite_module modules/mod_rewrite.so
もし、この行が無い場合は少し厄介です。まずはmod_rewrite.soファイルを探します。見つかれば上記のようにLoadModuleディレクティブでモジュールをロードするように設定します。mod_rewrite.soファイルも無い場合は、コンパイルが必要になってくると思います。ここではその詳細までは説明しきれませんので、必要ならさらに調べてみてください。
mod_rewriteモジュールの設定
モジュールがロードされているのを確認できたら、最後に必要なのはmod_rewriteモジュールの設定です。しかし、これはWordPressが設定してくれます。ただし、これにはWordPressインストールディレクトリでの.htaccessファイルを利用可能にする必要があります。
ここでWordPressは/var/www/html/blogディレクトリにインストールされているとします。他のディレクトリにインストールした場合は読み替えてください。
Apacheで.htaccessファイルを利用可能にする
Apacheで.htaccessファイルを利用できるようにするには、httpd.confに次のような記述を追加します。
<Directory パス> AllowOverride ディレクティブタイプ </Directory>
この設定はパスに指定したディレクトリおよびそのサブディレクトリで.htaccessファイルによるhttpd.confの設定の上書きを許可します。ディレクティブタイプはどのようなディレクティブの上書を許可するかを指定します。
WordPressで.htaccessファイルを使用するので、パスにはWordPressをインストールしたディレクトリを指定します。また、mod_rewriteモジュールの設定の上書きを許可するためにAllowOverrideにはディレクティブタイプとしてFileInfoを指定します。.htaccessファイルで指定できるすべてのディレクティブを許可するALLを指定することもできます。
<Directory /var/www/html/blog> AllowOverride FileInfo </Directory>
WordPressインストールディレクトリのアクセス権の設定
ここまでの設定をした後、WordPressでパーマリンクの設定を変更するとmod_rewriteモジュールの設定を記載した.htaccessファイルをWordPressインストールディレクトリに作成します。しかし、そのためにはWordPressインストールディレクトリのアクセス権が適切に設定されていなければなりません。要件は次の2つです。
- WordPressがインストールディレクトリに.htaccessファイルを作成できる
- Apacheが.htaccessを参照できる
ここではこの要件を満たすようにWordPressインストールディレクトリおよびその配下のファイルの所有者とグループ所有者はApacchiのプロセス所有者と同じにします。次のコマンドでWordPressインストールディレクトリおよびその配下のファイルの所有者とグループ所有者をすべて変更できます。
# chown -R apache:apache /var/www/html/blog
ここでApacheのプロセスの所有者はapacheを想定しています。プロセスの所有者が異なる場合は読み替えてください。
動作を確認する
これで設定はすべて完了しましたので実際に動作するか確認します。WordPressにログインしてパーマリンク設定を変更して保存します。WordPressのインストールディレクトリに.htaccessファイルがあるか確認してみます。次に何か投稿ページにアクセスしてみます。パーマリンク設定変更後のURLでアクセスできると思います。
httpd.confファイルでmod_rewriteモジュールの設定をする
.htaccessファイルで設定できることはすべてhttpd.confでも設定できますので、/etc/httpd/conf/httpd.confを編集する権限があるのならなら.htaccessファイルは使わない方がセキュリティ上は好ましいです。ここではおまけとしてhttpd.confに設定する場合について紹介します。.htaccessファイルはhttpd.confファイルを編集する権限は無いが、ある特定のディレクトリには権限があるユーザーにhttpd.confファイルの設定を上書きできるようにするためあります。
httpd.confの設定は<Directory>ディレクティブの中に.htaccessファイルと同じ設定を記述するだけです。WordPressを/var/www/html/blogにインストールした場合は次のような記述をhttpd.confに追加します。
<Directory /var/www/html/blog> # ここに.htaccessファイルと同じ設定を # 記載します。 </Directory>