🤩

Laravelを共有レンタルサーバーに設置する時のpublic

に公開

共有レンタルサーバーでLaravelを使う時、artisanが使えなくて、どうしようかなって思うときありますよね、多分w
Laravelの構成そのままpublic_htmlにアップしてもいいのだけど、そうなるとパスがおかしくなるし、なによりpublic_htmlの中にLaravelのコアは入れたくないですよね。
ということで、数時間格闘した記録をここに備忘録して残します。

Laravelの構成

Laravelは通常、こういった構成になってます。

この中のpublicが公開用のディレクトリでindex.phpや画像があり、サーバーで言うところのhtdocsだったり、public_htmlだったりします。
それ以外は、コアなので公開できる場所にはおかないように構成を変えていきたいと思います。

公開用に分ける

このpublicの中身をごっそりそのまま外に出したいと思います。
サーバーにpublic_htmlがある設定で作ります。
public_htmlには、publicの中身を全部入れます。
そして残りのLaravelフォルダとファイルは全てcoreというディレクトリを作って入れます。

こういった構成になります。

index.phpの編集

このままでは、index.phpがLaravelの内部にアクセスできないので、修正します。

public_html/index.php
if (file_exists($maintenance = __DIR__.'/../core/storage/framework/maintenance.php')) {
    require $maintenance;
}

require __DIR__.'/../core/vendor/autoload.php';

$app = require_once __DIR__.'/../core/bootstrap/app.php';

これでindexからのアクセスは可能になりました。

app.phpの編集

$appでPublicの場所を指定しているので上書きしてあげます。
ディレクトリ指定は、最初にアクセスするbootstrapのapp.phpで行います。

Laravel10まで

bootstrap/app.php
$app->bind('path.public', function () {
    return realpath(base_path() . '/../public_html');
});
return $app;

【重要】Laravel11.xxからappの書き方が変更になってます。
もとのreturn文を全て$appに代入してからusePublicPathに上書きします。

bootstrap/app.php
$app = Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })
    ->create();

    $app->usePublicPath(realpath(base_path() . '/../public_html'));
return $app;

publicへのパスは、1階層上のpublic_htmlだよと書いています。

viteの編集

buildしたものであればこのままでも動くのですが、run devだとviteのエラーが出ます。
なので、vite.config.jsにPublicの位置の追加を指定するコードを追加します。
viteからの位置を書けばOK

vite.config.js
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';

export default defineConfig({
    plugins: [
        laravel({
            publicDirectory: "../public_html", //追加部分
            input: [
                "resources/css/app.css",
                "resources/scss/app.scss",
                "resources/js/app.js",
            ],
            refresh: true,
        }),
    ],
});

設定後は、artisanしましょう。

php artisan config:clear
php artisan cache:clear

とりあえずこれで現状は問題なく動作しています。

Discussion