さくらのレンタルサーバーにLaravelプロジェクトを構築した際に、トップページ以外 Not Found の状態に陥って数時間格闘してしまいました。(http://hoge.sakura.ne.jp/ は表示できるが http://hoge.sakura.ne.jp/foo が表示できない)

原因はかなり初歩的なミスだったので、
懺悔の意味も込めて、反映手順と解決法を書き留めます。

環境

  • さくらのレンタルサーバー : スタンダード
  • お名前ドットコムのレンタルサーバーは、Laravelの動作保証してないとのこと
  • PHP : 7.2.10
  • Laravel : 5.7

反映手順

1. 反映モジュールの準備

※レンタルサーバー上で git clone できるのであれば、この手順は不要

1-1. ソースコードのダウンロード

i-chef___corporate-website_·_GitLab.png

1-2. レンタルサーバーへアップロード

i-chef_i-chef_sakura_ne_jp_-_FileZilla.png

2. サーバーでの作業

# SSHログイン
$ ssh hoge@hoge.sakura.ne.jp

2-1. PHPのバージョン確認

# バージョン確認(PHP >= 7.1.3)
% php -v
PHP 7.2.10 (cli) (built: Sep 14 2018 10:32:29) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.10, Copyright (c) 1999-2018, by Zend Technologies

7.1.3より低い場合は、以下の手順でPHPのバージョンを更新してください。
PHPのバージョン変更 - さくらのサポート情報

2-2. composerのインストール

# ~/bin 配下にインストール
% mkdir ~/bin
% curl -sS https://getcomposer.org/installer | php -- --install-dir=bin --filename=composer
% chmod 755 bin/composer

# 一旦ログアウトして、再度SSHログイン
% exit

# インストールできたことを確認
% composer -V
Composer version 1.7.2 2018-08-16 16:57:12

2-3. Laravelプロジェクトのパッケージインストール

# ソースコードの配置
# git
% git clone git@github.com:foga/hoge.git laravel
or
# file upload
% unzip hoge-master.zip
% mv hoge-master laravel

% cd ~/laravel

# パッケージインストールと最適化
% composer install
% composer dump-autoload --optimize

# ディレクトリに権限追加
% chmod -R 777 bootstrap/cache
% chmod -R 777 storage

2-4. プロジェクトの設定

※さくらのコントロールパネルからデータベースを作成
データベースの作成・追加・削除 - さくらのサポート情報

# APP_KEY の生成
% php artisan key:generate --show

# .env の設定
% vi .env
------------------------------------------
APP_NAME=hoge
APP_ENV=production
APP_KEY={{ ↑で生成した値 }}
APP_DEBUG=false
APP_URL=http://hoge.sakura.ne.jp

# コントロールパネルの情報を元にDB接続情報の変更

# その他メール接続情報など自身の環境に応じて
------------------------------------------

# テーブルの作成
% php artisan migrate

2-5. キャッシュ

% php artisan config:cache
% php artisan route:cache

LogicException  : Unable to prepare route [api/user] for serialization. Uses Closure.

php artisan route:cache で上記エラーメッセージが出るのは、ルーティングでクロージャーを使用しているためです。
routes/api.php もしくは routes/web.php の記述を見直してコントローラーに移動させる or コメントアウト。

routes/api.php が、デフォルトでクロージャー使用しています。

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

2-6. シンボリックリンクの追加

Webサーバのドキュメント/Webルート が public になるように設定。
ただし、さくらのレンタルサーバーでは、Apache側のドキュメントルートの設定を変更できないため、シンボリックリンクの追加で対応します。

% ln -s public/* ~/www  ※間違っているので、正解は後ほど

public/index.php がアプリケーションへ送信された、全HTTPリクエストを始めに処理するフロントコントローラとして動作します。

2-7. サイト公開

http://hoge.sakura.ne.jp
にアクセスして、サイトが公開されていることが確認できました!めでたしめでたし〜

と思いきや…

http://hoge.sakura.ne.jp/foo にアクセスしてみると

404 Not Found
The requested resource /foo was not found on this server.

で画面が見えませんorz

2-8. 沼からの脱出

ここから2〜3時間沼にハマってしまって、 .htaccess の中身いじってみたり、Laravelのキャッシュクリアしてみたり、試したけど答え出ず…

そこで、冷静になってエラー画面確認するとLaravelではApacheのエラー画面であることに気付き再度 ~/www/.htaccess が存在するか確認

% ls -la ~/www/
total 8
drwxr-xr-x   2 hoge  users  512 Oct 25 19:10 .
drwx------  12 hoge  users  512 Oct 25 21:54 ..
lrwxr-xr-x   1 hoge  users   31 Oct 25 17:42 css -> /home/hoge/laravel/public/css
lrwxr-xr-x   1 hoge  users   39 Oct 25 17:42 favicon.ico -> /home/hoge/laravel/public/favicon.ico
lrwxr-xr-x   1 hoge  users   31 Oct 25 17:42 img -> /home/hoge/laravel/public/img
lrwxr-xr-x   1 hoge  users   37 Oct 25 17:42 index.php -> /home/hoge/laravel/public/index.php
lrwxr-xr-x   1 hoge  users   30 Oct 25 17:42 js -> /home/hoge/laravel/public/js
lrwxr-xr-x   1 hoge  users   38 Oct 25 17:42 robots.txt -> /home/hoge/laravel/public/robots.txt
lrwxr-xr-x   1 hoge  users   32 Oct 25 17:42 scss -> /home/hoge/laravel/public/scss
lrwxr-xr-x   1 hoge  users   31 Oct 25 17:42 svg -> /home/hoge/laravel/public/svg
lrwxr-xr-x   1 hoge  users   34 Oct 25 17:42 vendor -> /home/hoge/laravel/public/vendor
lrwxr-xr-x   1 hoge  users   38 Oct 25 17:42 web.config -> /home/hoge/laravel/public/web.config

ない〜!あるはずの .htaccess がない〜!!! \(^o^)/オワタ

2−6でシンボリックリンク追加した際に、 public/*.htaccess が対象に含まれていなかったというオチでした。

% ln -s public/.htaccess ~/www

% ls -la ~/www/
total 8
drwxr-xr-x   2 hoge  users  512 Oct 25 19:10 .
drwx------  12 hoge  users  512 Oct 25 21:54 ..
lrwxr-xr-x   1 hoge  users   37 Oct 25 19:10 .htaccess -> /home/hoge/laravel/public/.htaccess
lrwxr-xr-x   1 hoge  users   31 Oct 25 17:42 css -> /home/hoge/laravel/public/css
lrwxr-xr-x   1 hoge  users   39 Oct 25 17:42 favicon.ico -> /home/hoge/laravel/public/favicon.ico
lrwxr-xr-x   1 hoge  users   31 Oct 25 17:42 img -> /home/hoge/laravel/public/img
lrwxr-xr-x   1 hoge  users   37 Oct 25 17:42 index.php -> /home/hoge/laravel/public/index.php
lrwxr-xr-x   1 hoge  users   30 Oct 25 17:42 js -> /home/hoge/laravel/public/js
lrwxr-xr-x   1 hoge  users   38 Oct 25 17:42 robots.txt -> /home/hoge/laravel/public/robots.txt
lrwxr-xr-x   1 hoge  users   32 Oct 25 17:42 scss -> /home/hoge/laravel/public/scss
lrwxr-xr-x   1 hoge  users   31 Oct 25 17:42 svg -> /home/hoge/laravel/public/svg
lrwxr-xr-x   1 hoge  users   34 Oct 25 17:42 vendor -> /home/hoge/laravel/public/vendor
lrwxr-xr-x   1 hoge  users   38 Oct 25 17:42 web.config -> /home/hoge/laravel/public/web.config

これで http://hoge.sakura.ne.jp/foo もアクセス出来るようになりました!

本来は ln -s public/* ~/www ではなく、wwwのサブディレクトリに対してシンボリックリンクを貼って( ln -s public ~/www/web )、コントロールパネルからドメインのWebパスを ~/www/web に設定すれば、このような自体には陥らないと思います。
※ ***.sakura.ne.jp はWebパスの設定を ~/wwwから変更できませんが、それ以外の独自ドメインは変更可能です。

***.sakura.ne.jp でチャチャッと動作確認したかったので手抜きしたら、このような沼にハマってしまいました。

急がば回れですね〜

同じような状態に陥っている人の助けになれば幸いです。

以上。

補足

.htaccess の編集

「さくらのレンタルサーバー + Laravel」でググると .htaccess の変更も必要という情報が複数出てきますが、さくらのレンタルサーバー側のApacheの対応も入ったこともあり、Laravel5.7 では編集なしで動くようになっています。(2018/10/25 時点)

キャッシュのクリア

キャッシュが残っていると、上手く動かない場合もあるようなので、以下のクリアコマンド試してみてください。

% php artisan cache:clear
% php artisan config:clear
% php artisan route:clear
% php artisan view:clear

Failed to clear cache. Make sure you have the appropriate permissions.

% php artisan cache:clear で、上記エラーが出るのは storage/framework/cache/data ディレクトリが無いのが原因。
mkdir storage/framework/cache/data で解決。