LoginSignup
5
4

More than 5 years have passed since last update.

どちらもhtaccessのリダイレクトを使っているWordPressとCakePHPの共存をする話

Posted at

CakePHPはレンタルサーバでも使用可能なケースが多いので、使ってみたけど、.htaccessの設定を正確に使うと、柔軟な運用ができそう。

目的

CakePHPのルーティング機能を使って管理する部分と、そうでないところを明確に分ける話。

箇条書きや図を使った説明の方が捉えやすそう。
話の内容に関係ないところは省略しています。

こんなURLで表示させたい

サイトの階層が /base から始まり、CakePHPのwebrootは /base/ と定義した上で、以下のようなURLで表示させたい。

  1. /base/items     商品一覧 
  2. /base/items/:id   商品詳細(:id は商品の個別id)
  3. /base/diary     日記一覧
  4. /base/diary/wp/:post 日記詳細(:postは投稿IDなどのスラッグ)
  5. /base/admin 商品などの管理画面

なお、1と2、5はCakePHPで動的に生成されるページ、3は生PHPで表示するページ、4はWordPressで表示させるページである。

実際には、こんな構造だ

ディレクトリ構造
base---cakephp(CakePHPのappなどが存在する)
    |
    |--diary|--wordpress(diaryの日々データが存在する)
    |       |--index.php(diaryのトップページ)
    | 
    |--index.php(cakephpの制御に関わる操作を行う)
    |--.htaccess(今回の本題。リダイレクト処理設定などをしている)

ここで重要なのが、/base/ 直下からCakePHPを動かすための.htaccessindex.phpが存在し、その配下にWordPressを動かすためのソースが存在することになる。

また、WordPressによるコンテンツ管理を行うのは、/base/diary/wp 以下のURLであるということ。

だから・・・

.htaccessのmod_rewrite機能を使い、CakePHPによるルーティングなどをさせない設定が必要になった。

設定作業

.htaccessの設定

下記ソースのように RewriteCond $1 !^/base/diary/* と追記。
これは、アドレスが/base/diary/(何か)となる場合、mod_rewriteの対象外とする

.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    #下記1行追加
    RewriteCond $1 !^/base/diary/*

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

備考:環境

直接は関係ないかもしれないけど、記載

  • CentOS 6.7
  • Apache 2.2.15
  • PHP 5.3.3
  • MySQL 5.6
  • WordPress 4.4
  • CakePHP 2.8.1
5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4