CakePHPはレンタルサーバでも使用可能なケースが多いので、使ってみたけど、.htaccess
の設定を正確に使うと、柔軟な運用ができそう。
目的
CakePHPのルーティング機能を使って管理する部分と、そうでないところを明確に分ける話。
箇条書きや図を使った説明の方が捉えやすそう。
話の内容に関係ないところは省略しています。
こんなURLで表示させたい
サイトの階層が /base から始まり、CakePHPのwebrootは /base/ と定義した上で、以下のようなURLで表示させたい。
- /base/items 商品一覧
- /base/items/:id 商品詳細(:id は商品の個別id)
- /base/diary 日記一覧
- /base/diary/wp/:post 日記詳細(:postは投稿IDなどのスラッグ)
- /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を動かすための.htaccess
やindex.php
が存在し、その配下にWordPressを動かすためのソースが存在することになる。
また、WordPressによるコンテンツ管理を行うのは、/base/diary/wp 以下のURLであるということ。
だから・・・
.htaccess
のmod_rewrite機能を使い、CakePHPによるルーティングなどをさせない設定が必要になった。
設定作業
.htaccessの設定
下記ソースのように RewriteCond $1 !^/base/diary/*
と追記。
これは、アドレスが/base/diary/(何か)
となる場合、mod_rewriteの対象外とする
<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