Laravel × WordPress
Laravelをインストールして、同一サーバ内でVHなどを切らずにWordPressと共存させる事が出来るかを調査しました。
目標
下記の様なディレクトリ構成で、LaravelとWordPressを共存させる。
[laravel-project]$ tree -L 2 . ├── app │ ├── commands │ ├── config │ ├── controllers │ ├── database │ ├── filters.php │ ├── lang │ ├── models │ ├── routes.php │ ├── start │ ├── storage │ ├── tests │ └── views ├── artisan ├── bootstrap │ ├── autoload.php │ ├── compiled.php │ ├── paths.php │ └── start.php ├── composer.json ├── composer.lock ├── CONTRIBUTING.md ├── phpunit.xml ├── public │ ├── favicon.ico │ ├── index.php │ ├── wordpress │ ├── packages │ └── robots.txt ├── readme.md ├── server.php └── vendor ├── autoload.php ├── ....
Laravelがインストールされている状態のドキュメントルートの public
の中に、 wordpress
というディレクトリを作って、そこにWordPressをインストールして動かしたいワケです。
問題
どうしようもないやつ
もちろんの問題があって、Laravel側に wordpress
というパラメータは渡す事はできません。こればっかりはVH切るなりで対応しないとどうしようもなさそうですね。
基本のリライト設定の確認
そもそもで、Laravelの .htaccess
を確認すると、
Options -MultiViews RewriteEngine On # 最後がスラッシュのURLでアクセスされた場合のリダイレクト RewriteRule ^(.*)/$ /$1 [L,R=301] # フロントコントローラーへの処理 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L]
アクセスしているURLが、ディレクトリでもファイルでもなかった場合、Laravelのコントローラである index.php
にリライトして、ルーティングなどを行います。
wordpress
ディレクトリが存在している場合に、 /wordpress
にアクセスされると、
リライトせずに /wordpress/
へのアクセスとして処理されます。
最大の問題
実はここで、リライトの穴が存在します。
<FQDN>/wordpress
にアクセスをした場合、存在するディレクトリにアクセスしているため、リライトされません。
apacheはディレクトリに対するアクセスと判断し、 /wordpress/
にリダイレクトをさせて、DirectoryIndexのファイルを探しに行く訳ですが・・・
なんと、最後のURLがスラッシュで終わっていた場合、.htaccessはスラッシュを消したURLにリダイレクトしています。よって、apacheが再度最後にスラッシュを付けてリダイレクト、 .htaccess
がスラッシュを消してリダイレクト、以下無限ループ。 で、困っちゃう訳ですね。
解決法
/wordpress/
以下に対するアクセスはまるっとhtaccessのリライトから除く必要があります。
Options -MultiViews RewriteEngine On # 最後がスラッシュのURLでアクセスされた場合のリダイレクト RewriteCond %{REQUEST_URI} !^/wordpress.*$ RewriteRule ^(.*)/$ /$1 [L,R=301] # フロントコントローラーへの処理 RewriteCond %{REQUEST_URI} !^/wordpress.*$ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L]
RewriteCond %{REQUEST_URI} !^/wordpress.*$
で、 /wordpress
以下のアクセスをリライト対象から外しています。
これで共存が出来ますね。
元記事はこちらです。
「LaravelとWordPressの共存」