Laravel パスワードリセットメールのリンクをクリックするとObject not found!と表示される

ローカル環境(XAMPP)でLaravelアプリを製作中の話。

Laravelアプリに認証機能を付けてパスワードリセットを試しに使ってみたところ、以下の通りGメールを利用してメールを送信することはできた。

LaravelでGメールを送信する方法。アプリパスワードを取得すればOK。 LaravelでGメールを送信する方法。アプリパスワードを取得すればOK。

しかし、届いたメール内のリンクをクリックすると”Object not found!”と表示されてパスワードリセットの手続きを進めることができなくなった。

Laravel パスワードリセットのURLをクリックするとObject not found!と表示される

よくよく調べてみると、本来URLは”localhost:8000/…”のようにポート番号を含めた形でなければいけないのに”localhost/…”のようにポート番号なしとなっていた。

Laravel パスワードリセットのURLからポート番号が抜けている

手打ちでポート番号を足して”localhost:8000/…”にするとパスワードリセットのページがきちんと表示されたので、ページ自体は存在していることを確認できる。

解決方法は.envのAPP_URLにポート番号を足すだけ。

.env


# 変更前
# APP_URL=http://localhost

# 変更後(ポート番号を記載)
APP_URL=http://localhost:8000

なぜこれで解決するかというと、パスワードリセットメールのリンクのURLを作る際に.envのAPP_URLを使っているから。

vender/laravel/framework/src/Illuminate/Auth/NotificationsResetPassword.php


// パスワードリセット機能の大元である"ForgotPasswordController.php"から辿っていけば
// このファイル(NotificationsResetPassword.php)に辿り着ける。

public function toMail($notifiable)
{
    // 略

    return (new MailMessage)
        // 略
            
        // config('app.url')で.envのAPP_URLを呼び出している
        ->action(Lang::get('Reset Password'),
                 url(config('app.url').route('password.reset',
                                             ['token' => $this->token,
                                              'email' => $notifiable->getEmailForPasswordReset()],
                                              false)))
        // 略
}

これでパスワードリセットのメール内のURLも”localhost:8000/…”となり、クリックしたときにパスワードリセットのページが表示されるようになった。

Laravel APP_URLにポート番号を足すとパスワードリセットのURLにもポート番号が付いてアクセスできるようになった

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です