【Laravel】URLのwwwありをwwwなしに統一する方法!リダイレクトミドルウェア

この記事からわかること

  • LaravelURLwwwありをwwwなし統一する方法
  • ミドルウェア実装方法
  • .htaccessでは動作しない?

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

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

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index