【Laravel】URLのwwwありをwwwなしに統一する方法!リダイレクトミドルウェア
この記事からわかること
- LaravelでURLのwwwありをwwwなしに統一する方法
- ミドルウェアの実装方法
- .htaccessでは動作しない?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Laravel:8.83.27
- Laravel Installer:4.2.9
- PHP(MAMP): 8.0.8
- macOS:Sonoma 14.1
LaravelでURLをwwwあり→wwwなしにリダイレクトさせる方法
Laravelプロジェクトでは何も設定をしないとURLがwwwあり/なしでも動作するようになっていました。これでは同じページを表示するのにURLが2つになってしまってGoogleの評価も下がってしまうので正規化する必要があります。
https://appdev-room.com/
https://www.appdev-room.com/
.htaccessでは動作しなかった
URLの正規化をする方法として.htaccess
でリダイレクト処理を実装して設置する方法が一般的ですが、私のLaravelプロジェクトではうまく動作しませんでした。
wwwなしに統一するコード
RewriteEngine on
RewriteCond %{HTTP_HOST} ^https://www\.ドメイン名\.com
RewriteRule (.*) https://ドメイン名.com/$1 [R=301,L]
このコードを追加した.htaccess
をLaravelプロジェクトのルートやpublic
直下などに設定してみましたが、リダイレクトが正常に動作しませんでした。
ミドルウェアを実装して解決
URLをwwwあり→wwwなしにリダイレクトさせる解決策は専用のミドルウェアを作成し、アクセスされる際にwwwがある場合にLaravelでリダイレクトさせる方法です。まずはartisan
コマンドでミドルウェアクラスを追加します。
$ php artisan make:middleware RedirectIfWWW
作成されたミドルウェアの中身を以下のように変更します。
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class RedirectIfWWW
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
// リクエストのホスト名が 'www.' で始まるかどうかを確認
if (substr($request->header('host'), 0, 4) === 'www.') {
// 'www.' を除いたホスト名を取得
$host = substr($request->header('host'), 4);
// リクエストURI(パスとクエリ文字列)を取得
$uri = $request->getRequestUri();
// 新しいURLに301リダイレクト
return redirect()->to($request->getScheme() . '://' . $host . $uri, 301);
}
// リクエストを次のミドルウェアまたはコントローラに渡す
return $next($request);
}
}
ミドルウェアを追加したのでKernel.php
に追加して完了です。
// グローバルミドルウェアの登録(全てのアクセスに適応)
protected $middleware = [
// 〜〜〜〜〜〜〜
\App\Http\Middleware\RedirectIfWWW::class,
];
これでwwwあり→wwwなしにリダイレクトさせることができているはずです。うまく動作しない場合はキャッシュを削除してみてください。
$ php artisan config:cache
$ php artisan route:cache
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。