📙

【Laravel】既存URLのリダイレクト対応

2025/03/28に公開

1. 概要

現行のURLに.phpの表記があるが、laravel移行に伴い「.php」の表記はなくす方向となった。

「.php」の表記をなくすことで、既存ページをお気に入りしている人が404等の表示でアクセスできなくなってしまうため、対策が必要となる。対応方法について以下に説明していきます。

既存パス https://domain.jp/samples/detail.php?id=1
新規パス https://domain.jp/samples/detai/1

2.対応方法

既存ルート用のルートパスと新規ルートパスの2つを作成する。
web.php

Route::prefix('samples')->name('samples.')->group(function () {
    Route::get('/', [SampleController::class, 'index'])->name('index');
    // 新規パス
    Route::get('detail/{sample}', [SampleController::class, 'show'])->name('show');
    // 既存パス
  Route::get('detail.php', [RedirectController::class, 'courseDetail'])->name('detail-redirect');
});

拡張性やパラメータ取得のため、リダイレクト用のコントローラーを用意する。

既存パスで叩かれたURLはここのコントローラーにきて、idを取得し、新規ルートパスへリダイレクトする処理を行う。

パラメーターが複数ある場合や処理が必要になる場合は、都度コントローラ経由で対応していく。

※laravelでリダイレクト対応のヘルパー関数があるが、拡張性やリダイレクト時に処理を書きたい場合を考慮して以下で対応

<?php

namespace App\Http\Controllers\Front;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;

/**
 * RedirectController
 */
class RedirectController extends Controller
{
    /**
     * samples detail
     *
     * @param Request $request
     *
     * @return RedirectResponse
     */
    public function samplesDetail(Request $request): RedirectResponse
    {
     // 処理が必要な場合、ここで対応できる
        return redirect()->route('front.samples.detail', $request->id, 301);
    }
}

Discussion