サイトアイコン たーちゃんの「ゼロよりはいくらかましな」

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

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すると書き換わってしまう恐れもありますので、

注意が必要です。

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

 

それでは!!!

 

 


にほんブログ村


人気ブログランキング

モバイルバージョンを終了