public_html 以外のフォルダから公開する
既定では、ドメインはホームディレクトリの public_html を公開します。現代の PHP フレームワークは
逆の作りになっています。アプリケーションは 1 つのフォルダの中にあり、その中の public/
サブフォルダだけがウェブから到達可能であるべき、という設計です。.env ファイル — データベースの
パスワード、アプリケーションキー、決済認証情報 — は、意図的にその 1 つ上の階層に置かれます。
代わりにプロジェクト全体を公開すると、/.env は誰でもリクエストできる URL になります。
ドキュメントルートを選ぶことが、それを避ける方法です。
設定する
ドメイン → 対象ドメインの行 → ドキュメントルート。
ホームディレクトリ内 のフォルダを、それに対する相対パスで尋ねられます。
app/public
/home/you/app/public ではありません。空欄にすると public_html に戻ります。
パネルはフォルダがまだ存在しなければ作成し、ウェブサーバーの設定を書き換えて再読み込みします。 完了すると、現在公開している完全なパスを伝え、フォルダを作成しなければならなかった場合は明示的に そう述べます。
その後の典型的な構成:
/home/you/
├── app/ <- the whole project: composer.json, .env, vendor/
│ └── public/ <- the only part served to the web
└── public_html/ <- the default, no longer used
動作したか確認する
サイトを読み込みます。次に、保護していたファイルをリクエストします。
curl -sI https://yourdomain.com/.env
期待する答えは 403 です。200 はドキュメントルートがまだ .env の上にあり、変更が
反映されていないことを意味します — ドメインページを再読み込みし、行に入力したフォルダが表示
されていることを確認してください。
どのドメインにこれがあるか
- プライマリドメイン、アドオンドメイン、サブドメイン はそれぞれ独自のドキュメントルートと 独自の ドキュメントルート ボタンを持ちます。
- パーク(エイリアス)ドメイン にはありません。エイリアスは常にプライマリのウェブサイトを 提供し、それがエイリアスたる所以です。パネルはこう述べます。「パークドメインは常にプライマリの ウェブサイトを提供します。代わりにプライマリのドキュメントルートを変更するか、これをアドオン ドメインに変換してください。」
- リダイレクト にもありません。リダイレクトは自分自身のものを何も提供しません。
パネルが拒否するもの、そしてその理由
値は特権的な処理に達する前にチェックされ、反対側でも再度チェックされます。拒否はページ上の メッセージとして返り、何も変更されません。
| 入力したもの | 拒否される理由 |
|---|---|
/var/www/html、~/app |
ホームに対する相対でなければなりません。絶対パスと ~ は受け付けられません。 |
../../etc、app/../.. |
フォルダ名はドットで始められません。それが .. を不可能にします。構造上、ホームの外側には何も到達できません。 |
.ssh、.git、.config |
同じルールです。.ssh を公開すれば鍵がウェブに出ます。.git を公開すればソース履歴がそこに出ます。 |
tmp |
PHP のセッションファイルがそこにあります。公開することは訪問者のセッションを公開することです。 |
logs、etc、mail、ssl、backups |
アカウントのためにパネルが使用します。 |
a/b/c/d/e |
深さは最大 4 階層までです。 |
| 128 文字を超えるもの | 長すぎます。 |
サーバー自体でもう 1 つのチェックが行われます。フォルダはすべてのシンボリックリンクを解決した
うえで再チェックされます。ホームの外を指すシンボリックリンクは、たどるのではなく拒否されるので、
ln -s / ~/app が提供されるファイルシステムに化けることはありません。
証明書
何もすることはありません。証明書はフォルダではなく ドメイン に対して発行され、設定した ドキュメントルートは証明書が書かれる瞬間に読み直されます — なので HTTPS 設定中にそれを変更しても 安全です。すでに HTTPS を持つアドオンドメインはそれを保ちます。
何かおかしいと感じたとき
サイトがディレクトリ一覧や「index of /」を表示する。 新しいフォルダにまだ index.php も
index.html もありません。アプリケーションをアップロードするか、いずれかを持つフォルダに
ドキュメントルートを向けてください。
.env だけでなくすべてのページで 403。 フォルダは存在しますが、ウェブサーバーがその中を
読み込めません。特に SSH で別のユーザーとしてファイルを置いた場合は、フォルダとその親が自分の
アカウントに属していることをファイルマネージャーで確認してください。
すべてのページで 404、しかも 1 分前まで動いていた。 ドメインページを再読み込みし、行に
表示されるフォルダを読んでください。打ち間違いは入力どおりそのまま公開されます — パネルは
推測せずフォルダを作成するので、空の新しいフォルダが通常の原因です。public_html に戻すか、
正しいフォルダに設定してください。
すべてのページが、キーがないというフレームワークのエラーとともに 500 を返す。 それは
ドキュメントルートではなくアプリケーションの問題です — フレームワークには到達しています。
Laravel の場合、通常は APP_KEY が空です。