WordPressのパーマリンク変更でNot Foundの対処法

Contents

 

はじめに

eastforest_url

 

 

 

WordPressのデフォルトのパーマリンクってダサいですよね。「?」とか入っているし。
WordPress始めてもう4年も過ぎてて今更SEO対策のためというわけではないのですが、始めた当時は何が正解なのかもわからず、取り敢えず弄ってみたが画面が表示されず・・・
もともとはサーバの学習目的でWordPressを立てただけなので、パーマリンクの設定は放置してました。今回は気が向いたので改めてパーマリンクを設定し直そうと思ったのと、変更したら「Not Found」で画面が表示されなくなってしまい、対処法に少々ハマったので記事にしました。

 

WordPressのパーマリンクの設定

WordPressの管理画面で「設定」 > 「パーマリンク設定」で変更できます。

permalink

どんな形式がいいのか、参考になるサイトはたくさんあるので見てみるといいです。私はこちらのサイトを参考にさせていただきました。
私のサイトはすでに/esthome/というディレクトリを切っているので、その配下に/カテゴリ名/投稿IDの形式にするためカスタム構造に構造タグを設定しました。
permalink_tag構造タグについてはパーマリンクの右上の「ヘルプ」に説明があります。「ヘルプ」にもリンクがありますが、こちらも参考になります。
「変更を保存」をクリックして設定を反映します。
ちなみにカテゴリ名が日本語だとそのまま日本語が%category%に入るので、これがURLに表示されるのは好みじゃないです。URLコピペするとURLエンコードされてしまいますし。
管理画面の「投稿」 > 「カテゴリー」の編集でスラッグを設定することでパーマリンク用の文字列を設定できます。
%post_id%は記事固有のID(数字)が入るので特に弄る必要はありません。本当はURLである程度内容が分かるようにしたかったので、%postname%を使って記事名にしたいところでしたが、ほとんど記事名は日本語なのでそれがパーマリンクになるのはやはりちょっと・・・。記事名もスラッグ設定できるので、パーマリンク用にアルファベットにすることもできますが、毎回考えるのが非常に面倒だなと思って%post_id%に落ち着きました。

 

ブラウザにNot Foundが表示された場合

ユーザがパーマリンクで設定されたURLでアクセスしてきたときに、もともとのURLにリライトする必要があります。
Apacheの場合、mod_rewriteモジュールでリライト設定をしていますので、このモジュールが有効になっているか確認します。
ちなみに今回の環境はApache2.4でソースからインストールしてます。環境によって異なると思うので参考までに。


mod_rewriteの有効化

[root@localhost ~]# vi /usr/local/httpd-2.4.18/conf/httpd.conf

#LoadModule rewrite_module modules/mod_rewrite.so
# ↓
LoadModule rewrite_module modules/mod_rewrite.so

mod_rewriteモジュールが無効になっていたのでコメントを外してapache再起動して有効にします。

mod_rewriteの確認

[root@localhost ~]# /usr/local/httpd-2.4.18/bin/apachectl -M

 rewrite_module (shared)

rewrite_moduleが表示されることを確認する。
ここで私の環境の場合、Not Foundが改善されなくてトーンダウン・・・

パーマリンクのリライト設定

WordPressインストール時にインストールディレクトリ直下の.htaccessに記述されているらしいので一応確認。

[root@localhost ~]# cat /var/www/html/esthome/.htaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /esthome/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /esthome/index.php [L]
</IfModule>

# END WordPress

AllowOverrideで.htaccessファイルを制御する

結論から言うとセキュリティのため、私の環境では.htaccessファイルの機能を無効にしてたので、これを有効にしたら無事画面を表示させることができました。
Apacheの設定ファイルで複数個所に設定されていますが、設定するのはドキュメントルートのディレクトリだけです。

[root@localhost ~]# vi /usr/local/httpd-2.4.18/conf/httpd.conf

<Directory "/var/www/html">
...(省略)...

    #AllowOverride None
    # ↓
    AllowOverride All

...(省略)...
</Directory>

Apache再起動して設定を反映させます。
.htaccessファイル扱いは怖いので基本無効にしてます。ざっとネットで調べた感じでも上記の"AllowOverride All"の設定を紹介しているところが多かったですが、リライトの設定だけでNoneからいきなりAllというのはどうも抵抗があったので、他に設定がないか調べてみました。
公式ドキュメントを見るとmod_rewriteを有効にしたいだけなら、FileInfoでもよさそうです。

[root@localhost ~]# vi /usr/local/httpd-2.4.18/conf/httpd.conf

<Directory "/var/www/html">
...(省略)...

    #AllowOverride None
    #AllowOverride All
    AllowOverride FileInfo

...(省略)...
</Directory>

Apache再起動して設定反映。
うまくいきました!

■参考サイト

WordPressのパーマリンクを変更したら「Not Found」が表示された場合の対策
パーマリンク設定カスタム構造で404
WordPressの引越しでパーマリンクの404 Not Foundエラーが発生
Apacheのmod_rewriteモジュールの使い方を徹底的に解説