ロリポップ ライトプランでComposerを利用する

レンタルサーバーにPHPのライブラリをインストールしようとして困ったことはありませんか？ ロリポップのライトプランはSSHでログインできませんが、Composerを利用することはできます。さくらのレンタルサーバーのライトプランでも概ね同様です。

## ロリポップの特徴

Webサーバー(Apache)では、公開するためのファイルを配置するディレクトリパスの設定(ディレクティブ)を[DocumentRoot](https://httpd.apache.org/docs/2.4/ja/mod/core.html#documentroot)と呼びます。さて、レンタルサーバーによってはDocumentRootの外(上)のディレクトリにもアクセスできます。しかし、ロリポップのライトプランのFTP機能では、ApacheのDocumentRoot = ルート(アクセスできる一番上のディレクトリ)なので、その外にファイルを置けるような概念ではありません。

この仕様がなぜ良くないかと申しますと、PHPファイルにはDocumentRootに配置してWeb上からアクセスされるもの(典型的にはURLとphpファイル名が一致するもの)と、関数やクラス定義だけをするファイルなどがあるからです。プロジェクトの構成によっては「PHPで書かれた設定ファイル」や「部分テンプレート(共通テンプレート)」などがあるかもしれません。

要は、PHPファイルは直接起動されたいファイルと、直接起動されたくないファイルに分かれるのです。ロリポップ以外のレンタルサーバーではDocumentRootの外に配置することで簡単に分けることができますが、ロリポップの構成ではそれはできません。

### よい

```
.
├── cache
├── config.php
├── lib
│   └── functions.php
├── public
│   └── index.php
├── template
│   ├── body.tpl.php
│   ├── footer.tpl.php
│   └── header.tpl.php
└── vendor
```

### だめ

```
.
├── cache
├── config.php
├── functions.php
├── index.php
├── template
│   ├── body.tpl.php
│   ├── footer.tpl.php
│   └── header.tpl.php
└── vendor
```

## DocumentRootに置くべきファイルとは

伝統的なPHP(CGI)ではURLとphpファイル名が一致するので、Webページとしてアクセスされたいファイルとユーザーに直接公開するファイル(CSS, JavaScript, 画像ファイルなど)のみをDocumentRootに置きます。

一方で、ユーザーに直接公開／実行されたくないPHPファイルは理想的にはDocumentRootに置いてはいけません。典型的には関数定義ファイル、設定ファイル、コマンドラインから実行する前提のPHPスクリプト、Webページを表示するための`include`される前提の部分テンプレートファイル、ログファイル、コンパイルキャッシュファイル、セッションファイルなどです。

しかしながら、ロリポップではその理想的な構成をとることができません。

### `.htaccess`でディレクトリのアクセスを拒否する

[サーバーの仕様 / サービス - レンタルサーバーならロリポップ！](https://lolipop.jp/service/server-spec/)によれば、2018年9月28日現在でロリポップはApache 2.4.xを利用していて、 `.htaccess` での設定が利用可能になっています。

`.htaccess` はディレクトリ単位でApacheの設定を変更するためのファイルです。これを使ってアクセス権限を制御する方法はApacheの公式ドキュメント[Access Control - Apache HTTP Server Version 2.4](https://httpd.apache.org/docs/2.4/howto/access.html)で紹介されてます。

一番単純には、内容を公開したくないディレクトリに以下のような内容のファイルを配置してください。

```apache:.htaccess
Require all denied
```

`Require`ディレクティブの書式については[mod_authz_core - Apache HTTP Server Version 2.4#require](https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require)を読んでください。この記述は古い書式`Deny from All`と、やりたいことの意味は同じです。

また、設定を行った後は**必ず**意図通りにアクセスが拒否できるか動作確認をしましょう。セキュリティ対策をしたつもりが設定を間違ったせいで有効化されてないと悲しいですからね。ダミーの内容のファイルを配置してみて、設定を外したときにそのファイルが読み取れてしまうことを確認してみてもよいでしょう。

## Composerはローカルでセットアップする

お手持ちの作業用のPCでセットアップしてください。

 1. `composer`コマンドがなければ https://getcomposer.org/download/ に従って取得
    * コマンドとしてインストールしない場合は `php composer.phar ...` のように実行することもできます
 2. コマンドラインで `composer install --no-dev --prefer-dist --optimize-autoloader` を実行する
 3. FTPSなどで `vendor/` ファイルの内容ごと転送する

ただし依存するパッケージやフレームワークによっては`composer install`時に独自のスクリプトが動作して環境依存のファイルが作成されることも(もしかすると)ありうるので、これだけでは完動せず別の設定が必要なこともありえます。注意して検証してくださいね。

特にフレームワークや既存のWebアプリ/CMSを利用する際はdevelopmentモード(開発モード)の設定のままで公開サーバーに設置しないように十分気をつけてください。

## おまけ

### フレームワークで作ったアプリケーションをロリポップでホストできるか？

やればできるけど、やらない方がいいんじゃないでしょうか。Laravelであれば`public`、CakePHPであれば`webroot`などがデフォルトのDocumentRoot名ですが、どちらもDocumentRootの上の階層にファイルを置ける前提の構成です。

ロリポップのようにDocumentRoot外に置けない構成のレンタルサーバーに無理に設置した場合、考慮漏れで設定ファイルが漏洩するようなリスクは容易に想像がつきます。

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Don&#39;t 👏 put 👏 your 👏 .env 👏 files 👏 in 👏 the 👏 web-server  👏directory <a href="https://t.co/DWHmT6r6E3">https://t.co/DWHmT6r6E3</a> <a href="https://t.co/Qp5tun3CZh">pic.twitter.com/Qp5tun3CZh</a></p>&mdash; svbl (@svblxyz) <a href="https://twitter.com/svblxyz/status/1045013939904532482?ref_src=twsrc%5Etfw">September 26, 2018</a></blockquote>

今回の記事の本筋とは関係ないですが設定ファイルの漏洩はコワイですね。 `.env`が不意に公開されないようにするための`.htaccess`の記述方法は読者への課題とします。