シェアする

  • このエントリーをはてなブックマークに追加





【Laravel+Inertia+Vue】 URLにaliasのあるアプリでRoutingにハマった!

シェアする

  • このエントリーをはてなブックマークに追加
  • 0

Apache1台でいくつものwebアプリを運営しているとき、

ホスト名だけでは間に合わず、aliasを指定して振り分けることと思います。

今回、そのうちの1つにLaravel+Inertia+Vueのアプリがあったのですが、

Routingがうまく動作せずハマってしまったのでその解決をメモ。

Apacheのalias設定

そのサーバは以下のように複数のアプリをaliasをきって

振り分けていました。

<VirtualHost *:443>
Protocols h2 http/1.1
        ServerName test.sample.co.jp
        ServerAdmin hoge@fuga.biz
        DocumentRoot /home/test/wordpress
        alias /system "/home/test/prod/laravel/public"

test.sample.co.jpにはwordpressにアクセスさせ、

test.sample.co.jp/systemにはLaravelのアプリにアクセスさせる感じです。

RoutingとController

Routingを以下のように設定しました。

Route.get('/login',[AuthController.class, 'create']);

Controllerは以下のように記述していました。

class AuthController extends Controller
{
    public function create()
    {
        return Inertia::render('Auth/Login', []);
    }
}

この場合にうまく動作しない現象

さて、ここで以下のようにアクセスしてみました。

test.sample.co.jp/system/login

すると

test.sample.co.jp/system/system/login

systemが1つ多いURLにリダイレクトされる形になってしまいました。。。

原因と解決策

この問題を引き起こしている原因は、Inertia::renderメソッドが返却する

Responseクラスにありました。

このクラスは以下です。

vendor/inertiajs/inertia-laravel/src/Response.php

早速中身を眺めて行くと、toResponseというメソッドの中で、

以下のような記述がありました。

$page = [
            'component' => $this->component,
            'props' => $props,
            'url' => $request->getBaseUrl().$request->getRequestUri(),
            'version' => $this->version,
        ];

urlの値をbaseUrlとrequestUriを結合してますね。

baseUrlにsystemが入っているため、1つ多くsystemがくっついたURLになっていたと

考えられます。

なので、これをカットしてみました。

$page = [
            'component' => $this->component,
            'props' => $props,
            'url' => $request->getRequestUri(), // ←修正
            'version' => $this->version,
        ];

これで無事

test.sample.co.jp/system/login

へアクセスすることができるようになりました。

とはいえ、、、

修正する対象がvendor配下にあるプログラムを直接修正してしまっているので、

composerなどでversionupすると書き換わってしまう恐れもありますので、

注意が必要です。

なんかもっといい方法がありそうですが、一旦解決策でした。

それでは!!!

ブログランキング・にほんブログ村へ
にほんブログ村


人気ブログランキング

シェアする

  • このエントリーをはてなブックマークに追加

フォローはいかがですか?