# VPS から Xserver へ Laravel を移行する(シンボリックリンクでソース隠蔽)
VPS で運用していた Laravel を Xserver レンタルサーバーに移行する際、public_html 直下にプロジェクトを置くと .env や vendor/ が Web から参照されるリスクがある。本体はホーム直下の非公開エリアに置き、公開用には public だけをシンボリックリンクで見せる構成にすると、Xserver を安全にフル活用できる。
関連: レンタルサーバーなら xserver おすすめ理由 / xserver の PHP バージョンと SSH / Laravel 初期設定
# 前提
- Xserver の PHP は SSH 用にバージョン・パスを設定済み(composer / artisan 用)
# 理想の「隠蔽型」ディレクトリ構造
完成形は次のイメージ。本体は公開エリア外に置き、公開されるのは public の中身だけにする。
/home/ユーザー名/
├── プロジェクト名/ ← 本体(非公開)
│ ├── app/
│ ├── bootstrap/
│ ├── config/
│ ├── vendor/
│ ├── .env
│ └── public/ ← 本当の document root
│ ├── index.php
│ ├── .htaccess
│ └── ...
│
└── メインドメイン/
└── public_html/
└── サブドメイン名/
└── public_html ← シンボリックリンク(実体は プロジェクト名/public)
例: メインが example.com で API を api.example.com にする場合
/home/ユーザー名/
├── api.example.com/ # プロジェクト本体
│ ├── app/
│ ├── vendor/
│ ├── .env
│ └── public/
└── example.com/
└── public_html/
└── api.example.com/
└── public_html # → /home/ユーザー名/api.example.com/public へのシンボリックリンク
# 移行手順(3 ステップ)
# Step 1: プロジェクト本体をホーム直下に配置
VPS から持ってくる方法は主に次のどちらか。
A. Git でクローン(推奨)
cd /home/ユーザー名/
git clone [リポジトリURL] プロジェクト名
cd プロジェクト名
B. ファイルをアップロードする場合
SFTP や rsync で /home/ユーザー名/プロジェクト名/ に Laravel 一式を配置する。このとき public_html の下には置かない。
配置後、依存関係と .env を用意する。
cd /home/ユーザー名/プロジェクト名
composer install --no-dev --optimize-autoloader
cp .env.example .env
php artisan key:generate
# .env の DB_* 等を Xserver の環境に合わせて編集
Xserver の PHP が古い場合
SSH で使う PHP を 任意バージョンに切り替える必要がある。composer / php artisan はその PHP で実行される。
# Step 2: サブドメイン用の「実体フォルダ」を削除
Xserver でサブドメインを追加すると、public_html/サブドメイン名/public_html という実体ディレクトリが自動作成される。シンボリックリンクに差し替えるため、この public_html フォルダを削除する。
# パスを間違えないよう確認してから実行
rm -rf /home/ユーザー名/メインドメイン/public_html/サブドメイン名/public_html
例:
rm -rf /home/ユーザー名/example.com/public_html/api.example.com/public_html
# Step 3: public へのシンボリックリンクを作成
本体の public を、サブドメインの document root(public_html/サブドメイン名/public_html)に紐付ける。
ln -s /home/ユーザー名/プロジェクト名/public /home/ユーザー名/メインドメイン/public_html/サブドメイン名/public_html
例:
ln -s /home/ユーザー名/api.example.com/public /home/ユーザー名/example.com/public_html/api.example.com/public_html
これで https://api.example.com/ へのアクセスは、実体として /home/ユーザー名/api.example.com/public が読まれる。.env や vendor/ は URL から辿れない。
# .htaccess の確認(403 / ルーティング不具合時)
シンボリックリンク先を Apache が正しく扱うため、FollowSymLinks が必要。Laravel の public/.htaccess に以下があるか確認し、なければ先頭付近に追加する。
# シンボリックリンクの参照を許可
Options +FollowSymLinks
# 既存の Laravel ルーティング
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]
403 Forbidden や 404 が続く場合は、サーバー設定で AllowOverride が有効かも確認する(Xserver は多くのプランで有効)。
# 移行後のよくある作業
- ストレージのシンボリックリンク:
php artisan storage:linkを実行し、public/storage→storage/app/publicを張る。 - キャッシュ:
php artisan config:cache/route:cache/view:cacheで本番用にキャッシュ。 - 権限:
storage/とbootstrap/cache/が Web サーバーから書けるか確認。
# この構成のメリット
| ポイント | 説明 |
|---|---|
| セキュリティ | .env や vendor/ は document root 外のため、ブラウザから直接アクセスされない。 |
| Git 運用 | 本体ディレクトリで git pull すれば公開側もすぐ反映。public_html を汚さない。 |
| 管理のしやすさ | 公開されるのは「入り口」のシンボリックリンクだけなので、ドメインごとの役割が分かりやすい。 |
# まとめ
- プロジェクト本体を
/home/ユーザー名/直下に配置(public_htmlの外)。 - サブドメイン用に自動作成された
public_html/サブドメイン名/public_htmlを削除。 publicへのシンボリックリンクをpublic_html/サブドメイン名/public_htmlとして作成。- 必要なら
public/.htaccessでOptions +FollowSymLinksを付与。
これで VPS から Xserver へ、ソースを隠したまま Laravel を安全に移行できる。