ラック
Home > CMS > 記事 > 2017年11月 > WordPressのパーマリンク設定が効かない

WordPressのパーマリンク設定が効かない

カテゴリ: WordPress

開発用のCentOS7, Apache2.4系のサーバでWordPressのパーマリンク設定が効かず、沼にハマったので一部始終をメモしておきます。

経緯・症状

パーマリンクを基本以外に設定すると、カスタム投稿が404 Not Foundになることに気付いた。その後、普通の投稿も404であることに気付いた。

最終的に判明した原因と対処

最終的にはApacheのディレクティブの設定漏れが原因でした。具体的には

  • AllowOverrideの記述がなかった(デフォルトはAllowOverride none)
  • Optionsの記述がOptions Noneだった

の2つ。そのため、対処として以下の2行を追記。


#Options none # ←コメント化
AllowOverride All
Options FollowSymLinks
## ↑上の2行を追記

調査・原因追及

1. プラグインを停止

  • 普通の投稿でも404になったため、Custom Post Type Permalinksのようなプラグインが原因ではないと判断したが、念のためプラグインを停止
    • 結果: 変化なし

2. 他のパーマリンク設定を試す

  • 症状に気付いた際のパーマリンク設定がカスタム構造で/%year%/%month%/%day%/%post_id%/という数字ばかりの構造だったため、数字以外のパーマリンク構造(例: 投稿名)に設定を変えた
    • 結果: 変化なし

3. .htaccessをリフレッシュさせる

  • 時折、パーマリンク設定が上手く反映されないことがあるので、パーマリンク設定の画面で何も変更しないまま「変更を保存」で再読み込みさせる
    • 結果: 変化なし

4. .htaccessの権限を確認

WordPressのインストールされたルートディレクトリの.htaccessの所有者と権限を確認、更新日時から、書き込みできていることを確認。これより、.htaccessへの書き込みに失敗している、というわけではなさそう(仮に書き込み失敗していたらWordPressの管理画面でもエラーが表示されるはず)。

5. .htaccessをまったく別の記述に変える

  • .htaccessが正しく動作しているか確認するため、WordPressによって生成された.htaccessをいったん退避して、下記の.htaccessを作成。.htaccessが正しく動作していれば、トップページにアクセスした瞬間にgoogleにリダイレクトされるはず
    
    <IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    RewriteRule ^.*$ https://google.co.jp [L]
    </IfModule>
    
    • 結果: リダイレクトされない

6. Apacheの設定を確認

5.より、「そもそもApacheのmod_rewriteモジュールが動いていないのでは?」という推論に達する。一応、Apacheの設定を確認する。


# less /etc/httpd/conf/httpd.conf

## (前略)

# LoadModule foo_module modules/mod_foo.so
#
Include conf.modules.d/*.conf

## (後略)

conf.modules.d/ディレクトリ下のすべてのconfファイルを読み込んでいる。では、そのディレクトリの中身を確認。


# less /etc/httpd/conf.modules.d/00-base.conf

## (前略)

LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so

## (後略)

LoadModule rewrite_module modules/mod_rewrite.soの記述があるため、mod_rewriteモジュールはきちんと読み込まれていることが分かった。

7. ログを確認

mod_rewriteモジュールが読み込まれているならば、何かしらログが吐き出されているはず。そこで、/var/log/httpd/下のログを確認するも、形跡なし。


LogLevel alert rewrite:trace8

2.4系なので、上記の設定を行ってApacheの再起動を行うも、error_logに一切ログは吐き出されず。

以上より、「mod_rewriteモジュールは読み込まれているが機能していない」という状態であることが分かった。ログが出力されないので、ヒントが見付からないのがツラいところ。

8. 仮想サイトのディレクティブを眺める

結果的にはこれが正解だった。ヒントが見付からなかったことと、Apacheインストール後に特殊な設定をした記憶がなかったため、ディレクティブごとの設定ではないかと疑ったところ、ビンゴ。.htaccessを動作させるためには、下記の2つの設定が必要だった。


AllowOverride All
Options FollowSymLinks

しかし、WordPressがインストールされた仮想サイトのディレクティブは下記のようになっていた。


<Directory "/var/www/hoge/piyo/www/">
allow from all
Options None
Require all granted
</Directory>

AllowOverrideの記述はなく、Options Noneと、両方とも足りていない。そこで、下記のように変更した。


<Directory "/var/www/hoge/piyo/www/">
allow from all
AllowOverride All
#Options None
Options FollowSymLinks
Require all granted
</Directory>

これでApacheを再起動。すると、パーマリンク設定が有効になった。原因はApacheの仮想サイトのディレクティブ設定だった。

参考

WordPressのパーマリンク設定

mod_rewriteが有効か確認

Apacheのログ設定

Apacheの設定

タグ: トラブル対処,パーマリンク

 



関連する記事一覧