CakePHP3とWordPressを共存させるhtaccessの書き方

CakePHP htaccess WordPress PHP

こんばんは、るかです。
CakePHPネタばっかりなので次こそはNuxt.js周りのネタを書くぞい…!

個人的にはCakePHPとWordPressを一緒にするってことはあんまりしたくないのですが、ときにはやむにやまれず共存させなければならないときもあると思います。
WordPressって使い慣れてる人多いですし運用する側としてはいろいろ楽な部分もありますよね。

ざっくり仕組み

そもそもCakePHPもWordPressもすべてのアクセスをindex.phpに集め、そこを起点に様々な処理を振り分けて動的にページを生成しています。
つまりCakePHPで管理する部分とWordPressで管理する部分を適切に振り分けてあげられれば共存できるはずです。

CakePHPのhtaccess

まずはデフォルトのCakeのhtaccessから見てみます。

# Uncomment the following to prevent the httpoxy vulnerability
# See: https://httpoxy.org/
#<IfModule mod_headers.c>
#    RequestHeader unset Proxy
#</IfModule>
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule    ^(\.well-known/.*)$ $1 [L]
    RewriteRule    ^$    webroot/    [L]
    RewriteRule    (.*) webroot/$1    [L]
</IfModule>

これはインストールディレクトリ直下のhtaccessです。
.well-knownへのアクセス以外は全部webrootに流してます。

.well-knownはSSL証明書とかの認証に使うファイルが置かれたりするようなのでそこへのアクセスはリダイレクトしないようになっているようですねー

そしてもう一つwebrootディレクトリ直下にあるhtaccessです。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

RewriteCond %{REQUEST_FILENAME} !-f これは実在するファイルだった場合はリダイレクトしないという記述です。

つまりここでは実在するファイルへのリクエスト以外はindex.phpへアクセスを流すということになります。

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

デフォルトだとこんな感じです。
# BEGIN WordPress# END WordPressというコメントで挟まれているのはWordPressがパーマリンクの更新などでhtaccessを書き換える事があり、その目印になっています。
気をつけないといけないのはこのコメントに挟まれた部分に何かしらの記述を追加したり変更したりしたあとにパーマリンクの更新をすると変更した内容が上書きされてしまうので注意です。

余談ですがinsert_with_markers()っていう関数を使うとhtaccessに独自の記述などを追加することができたりします。

閑話休題。
このhtaccessの内容はRewriteCond %{REQUEST_FILENAME} !-fリクエストが実在するファイル名なのかどうかを判定し、RewriteCond %{REQUEST_FILENAME} !-dで実在するディレクトリなのかどうかも判定しています。
つまりリクエストが実在するファイルでもディレクトリでもない場合にはindex.phpにアクセスを流すという記述になっています。

共存の道

CakePHPとWordPressのhtaccessの記述をざっくり見たところでどう共存させるかです。

今回は例としてCakePHPのwebroot以下にwpというディレクトリを作り、その中にWordPressをインストールした状態と仮定して話を進めます。

早速htaccessファイルの記述例を書いてしまいます。

<IfModule mod_rewrite.c>
    RewriteEngine On

    # /wp/以下へのアクセスはそのまま
    RewriteCond %{REQUEST_URI}  ^/wp/(.*)$ [NC]
    RewriteRule . wp/%1 [L]

    # /news/以下はWordPressへリダイレクト
    RewriteCond %{REQUEST_URI} ^/news/.*
    RewriteRule . wp/index.php [L]

    # 上記以外はcakephp管理下へ
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

ベースはCakePHPのhtaccessです。

# /wp/以下へのアクセスはそのまま
RewriteCond %{REQUEST_URI}  ^/wp/(.*)$ [NC]
RewriteRule . wp/%1 [L]

この部分ですが、WordPressのインストールディレクトリへのアクセスはそのままWordPress以下にアクセスを流します。そうしないと管理画面なんかへのアクセスができません。

# /news/以下はWordPressへリダイレクト
RewriteCond %{REQUEST_URI} ^/news/.*
RewriteRule . wp/index.php [L]

例として今回はnewsとしましたが、WordPressで作ったカスタム投稿タイプのスラッグなどへのアクセスはwp/index.phpにアクセスを流してWordPressに処理させます。

例えばblogというスラッグを使っているのであればnews部分をblogに書き換えたり追記したりすればおっけーです。

# 上記以外はcakephp管理下へ
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

そして最後にそれらの条件に一致しなかった場合はすべてCakePHPへアクセスを流します。

まとめ

CakePHPとWordPressを共存させる場合アクセスを適切に振り分けてあげることができれば双方のシステムを共存させることができます。

最近はWordPressのコアにREST APIが統合されたのでそれぞれ別のシステムとして管理してAPI経由で記事データなどを取得したほうがスマートだと思います。