こんにちは、cloudpack小谷松 です。

Laravel × WordPress

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の共存