HTTPリクエスト
イントロダクション
LaravelのIlluminate\Http\Requestクラスは、アプリケーションが処理している現在のHTTPリクエストをオブジェクト指向で操作し、リクエストで送信された入力、Cookie、ファイルを取得する方法を提供します。
リクエストの操作
リクエストへのアクセス
依存注入を介して現在のHTTPリクエストのインスタンスを取得するには、ルートクロージャまたはコントローラメソッドでIlluminate\Http\Requestクラスをタイプヒントする必要があります。受信リクエストのインスタンスは、Laravelのサービスコンテナによって自動的に注入されます。
1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\RedirectResponse; 6use Illuminate\Http\Request; 7 8class UserController extends Controller 9{10 /**11 * Store a new user.12 */13 public function store(Request $request): RedirectResponse14 {15 $name = $request->input('name');16 17 // Store the user...18 19 return redirect('/users');20 }21}
前述のように、ルートクロージャでIlluminate\Http\Requestクラスをタイプヒントすることもできます。サービスコンテナは、クロージャが実行されるときに、受信リクエストを自動的にクロージャへ注入します。
1use Illuminate\Http\Request;2 3Route::get('/', function (Request $request) {4 // ...5});
依存注入とルートパラメータ
コントローラメソッドがルートパラメータからの入力も期待している場合は、他の依存関係の後にルートパラメータをリストする必要があります。たとえば、ルートが次のように定義されているとします。
1use App\Http\Controllers\UserController;2 3Route::put('/user/{id}', [UserController::class, 'update']);
コントローラメソッドを次のように定義することで、Illuminate\Http\Requestをタイプヒントし、idルートパラメータにアクセスできます。
1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\RedirectResponse; 6use Illuminate\Http\Request; 7 8class UserController extends Controller 9{10 /**11 * Update the specified user.12 */13 public function update(Request $request, string $id): RedirectResponse14 {15 // Update the user...16 17 return redirect('/users');18 }19}
リクエストパス、ホスト、メソッド
Illuminate\Http\Requestインスタンスは、受信HTTPリクエストを調べるためのさまざまなメソッドを提供し、Symfony\Component\HttpFoundation\Requestクラスを拡張しています。以下で最も重要なメソッドのいくつかについて説明します。
リクエストパスの取得
pathメソッドは、リクエストのパス情報を返します。したがって、受信リクエストがhttp://example.com/foo/barをターゲットにしている場合、pathメソッドはfoo/barを返します。
1$uri = $request->path();
リクエストパス/ルートの検査
isメソッドを使用すると、受信リクエストパスが指定されたパターンと一致するかどうかを確認できます。このメソッドを利用するときは、*文字をワイルドカードとして使用できます。
1if ($request->is('admin/*')) {2 // ...3}
routeIsメソッドを使用すると、受信リクエストが名前付きルートと一致したかどうかを判別できます。
1if ($request->routeIs('admin.*')) {2 // ...3}
リクエストURLの取得
受信リクエストの完全なURLを取得するには、urlメソッドまたはfullUrlメソッドを使用できます。urlメソッドはクエリ文字列なしのURLを返し、fullUrlメソッドはクエリ文字列を含みます。
1$url = $request->url();2 3$urlWithQueryString = $request->fullUrl();
現在のURLにクエリ文字列データを追加したい場合は、fullUrlWithQueryメソッドを呼び出すことができます。このメソッドは、指定されたクエリ文字列変数の配列を現在のクエリ文字列とマージします。
1$request->fullUrlWithQuery(['type' => 'phone']);
指定したクエリ文字列パラメータを除いた現在のURLを取得したい場合は、fullUrlWithoutQueryメソッドを利用できます。
1$request->fullUrlWithoutQuery(['type']);
リクエストホストの取得
host、httpHost、schemeAndHttpHostメソッドを介して、受信リクエストの「ホスト」を取得できます。
1$request->host();2$request->httpHost();3$request->schemeAndHttpHost();
リクエストメソッドの取得
methodメソッドは、リクエストのHTTP動詞を返します。isMethodメソッドを使用して、HTTP動詞が特定の文字列と一致するかどうかを確認できます。
1$method = $request->method();2 3if ($request->isMethod('post')) {4 // ...5}
リクエストヘッダ
Illuminate\Http\Requestインスタンスからリクエストヘッダを取得するには、headerメソッドを使用します。リクエストにヘッダが存在しない場合、nullが返されます。ただし、headerメソッドは、リクエストにヘッダが存在しない場合に返されるオプションの第2引数を取ります。
1$value = $request->header('X-Header-Name');2 3$value = $request->header('X-Header-Name', 'default');
hasHeaderメソッドを使用して、リクエストに特定のヘッダが含まれているかどうかを判別できます。
1if ($request->hasHeader('X-Header-Name')) {2 // ...3}
便宜上、bearerTokenメソッドを使用して、Authorizationヘッダからベアラトークンを取得できます。そのようなヘッダが存在しない場合は、空の文字列が返されます。
1$token = $request->bearerToken();
リクエストIPアドレス
ipメソッドは、アプリケーションにリクエストしたクライアントのIPアドレスを取得するために使用します。
1$ipAddress = $request->ip();
プロキシによって転送されたすべてのクライアントIPアドレスを含むIPアドレスの配列を取得したい場合は、ipsメソッドを使用できます。「元の」クライアントIPアドレスは配列の末尾になります。
1$ipAddresses = $request->ips();
一般的に、IPアドレスは信頼できない、ユーザーが制御する入力と見なされるべきであり、情報提供の目的でのみ使用してください。
コンテントネゴシエーション
Laravelは、Acceptヘッダを介して受信リクエストが要求したコンテントタイプを検査するためのいくつかのメソッドを提供しています。まず、getAcceptableContentTypesメソッドは、リクエストによって受け入れられたすべてのコンテントタイプを含む配列を返します。
1$contentTypes = $request->getAcceptableContentTypes();
acceptsメソッドは、コンテントタイプの配列を受け入れ、それらのコンテントタイプのいずれかがリクエストによって受け入れられる場合はtrueを返します。それ以外の場合は、falseが返されます。
1if ($request->accepts(['text/html', 'application/json'])) {2 // ...3}
prefersメソッドを使用して、指定されたコンテントタイプの配列のうち、リクエストが最も優先するコンテントタイプを判別できます。提供されたコンテントタイプのいずれもリクエストによって受け入れられない場合、nullが返されます。
1$preferred = $request->prefers(['text/html', 'application/json']);
多くのアプリケーションはHTMLまたはJSONのみを提供するため、expectsJsonメソッドを使用して、受信リクエストがJSONレスポンスを期待しているかどうかをすばやく判別できます。
1if ($request->expectsJson()) {2 // ...3}
PSR-7リクエスト
PSR-7標準は、リクエストとレスポンスを含むHTTPメッセージのインターフェイスを規定しています。Laravelリクエストの代わりにPSR-7リクエストのインスタンスを取得したい場合は、まずいくつかのライブラリをインストールする必要があります。Laravelは、Symfony HTTP Message Bridgeコンポーネントを使用して、典型的なLaravelのリクエストとレスポンスをPSR-7互換の実装に変換します。
1composer require symfony/psr-http-message-bridge2composer require nyholm/psr7
これらのライブラリをインストールしたら、ルートクロージャまたはコントローラメソッドでリクエストインターフェイスをタイプヒントすることにより、PSR-7リクエストを取得できます。
1use Psr\Http\Message\ServerRequestInterface;2 3Route::get('/', function (ServerRequestInterface $request) {4 // ...5});
ルートまたはコントローラからPSR-7レスポンスインスタンスを返すと、それは自動的にLaravelレスポンスインスタンスに変換され、フレームワークによって表示されます。
入力
入力の取得
全入力データの取得
受信リクエストのすべての入力データをarrayとして取得するには、allメソッドを使用します。このメソッドは、受信リクエストがHTMLフォームからのものであるか、XHRリクエストであるかに関係なく使用できます。
1$input = $request->all();
collectメソッドを使用すると、受信リクエストのすべての入力データをコレクションとして取得できます。
1$input = $request->collect();
collectメソッドでは、受信リクエストの入力のサブセットをコレクションとして取得することもできます。
1$request->collect('users')->each(function (string $user) {2 // ...3});
入力値の取得
いくつかの簡単なメソッドを使用すると、リクエストに使用されたHTTP動詞を気にすることなく、Illuminate\Http\Requestインスタンスからすべてのユーザー入力にアクセスできます。HTTP動詞に関係なく、inputメソッドを使用してユーザー入力を取得できます。
1$name = $request->input('name');
inputメソッドの第2引数としてデフォルト値を渡すことができます。この値は、要求された入力値がリクエストに存在しない場合に返されます。
1$name = $request->input('name', 'Sally');
配列入力を含むフォームを扱う場合は、「ドット」記法を使用して配列にアクセスします。
1$name = $request->input('products.0.name');2 3$names = $request->input('products.*.name');
引数なしでinputメソッドを呼び出して、すべての入力値を連想配列として取得できます。
1$input = $request->input();
クエリ文字列からの入力の取得
inputメソッドはリクエストペイロード全体(クエリ文字列を含む)から値を取得しますが、queryメソッドはクエリ文字列からのみ値を取得します。
1$name = $request->query('name');
要求されたクエリ文字列値データが存在しない場合、このメソッドの第2引数が返されます。
1$name = $request->query('name', 'Helen');
引数なしでqueryメソッドを呼び出して、すべてのクエリ文字列値を連想配列として取得できます。
1$query = $request->query();
JSON入力値の取得
アプリケーションにJSONリクエストを送信する場合、リクエストのContent-Typeヘッダがapplication/jsonに適切に設定されている限り、inputメソッドを介してJSONデータにアクセスできます。JSON配列/オブジェクト内にネストされた値を取得するために「ドット」構文を使用することもできます。
1$name = $request->input('user.name');
文字列化可能な入力値の取得
リクエストの入力データをプリミティブなstringとして取得する代わりに、stringメソッドを使用してリクエストデータをIlluminate\Support\Stringableのインスタンスとして取得できます。
1$name = $request->string('name')->trim();
整数入力値の取得
入力値を整数として取得するには、integerメソッドを使用できます。このメソッドは入力値を整数にキャストしようとします。入力が存在しないか、キャストが失敗した場合、指定したデフォルト値が返されます。これは、ページネーションやその他の数値入力に特に便利です。
1$perPage = $request->integer('per_page');
ブール入力値の取得
チェックボックスなどのHTML要素を扱う場合、アプリケーションは実際には文字列である「true」と見なされる値(例:「true」や「on」)を受け取ることがあります。便宜上、booleanメソッドを使用してこれらの値をブール値として取得できます。booleanメソッドは、1、「1」、true、「true」、「on」、「yes」に対してtrueを返します。他のすべての値はfalseを返します。
1$archived = $request->boolean('archived');
日付入力値の取得
便宜上、日付/時刻を含む入力値は、dateメソッドを使用してCarbonインスタンスとして取得できます。リクエストに指定された名前の入力値が含まれていない場合、nullが返されます。
1$birthday = $request->date('birthday');
dateメソッドが受け入れる第2引数と第3引数を使用して、それぞれ日付の形式とタイムゾーンを指定できます。
1$elapsed = $request->date('elapsed', '!H:i', 'Europe/Madrid');
入力値が存在するが形式が無効な場合、InvalidArgumentExceptionがスローされます。そのため、dateメソッドを呼び出す前に入力を検証することをお勧めします。
Enum入力値の取得
PHP Enumに対応する入力値もリクエストから取得できます。リクエストに指定された名前の入力値が含まれていない場合、またはEnumに入力値と一致するバッキング値がない場合、nullが返されます。enumメソッドは、第1引数と第2引数として入力値の名前とEnumクラスを受け入れます。
1use App\Enums\Status;2 3$status = $request->enum('status', Status::class);
入力値がPHPのEnumに対応する値の配列である場合、enumsメソッドを使用して値の配列をEnumインスタンスとして取得できます。
1use App\Enums\Product;2 3$products = $request->enums('products', Product::class);
動的プロパティによる入力の取得
Illuminate\Http\Requestインスタンスの動的プロパティを使用してユーザー入力にアクセスすることもできます。たとえば、アプリケーションのフォームの1つにnameフィールドが含まれている場合、次のようにフィールドの値にアクセスできます。
1$name = $request->name;
動的プロパティを使用する場合、Laravelは最初にリクエストペイロードでパラメータの値を検索します。存在しない場合、Laravelは一致したルートのパラメータでフィールドを検索します。
入力データの一部の取得
入力データのサブセットを取得する必要がある場合は、onlyメソッドとexceptメソッドを使用できます。これらのメソッドはどちらも単一のarrayまたは動的な引数リストを受け入れます。
1$input = $request->only(['username', 'password']);2 3$input = $request->only('username', 'password');4 5$input = $request->except(['credit_card']);6 7$input = $request->except('credit_card');
onlyメソッドは、リクエストしたすべてのキー/値のペアを返しますが、リクエストに存在しないキー/値のペアは返しません。
入力の存在
hasメソッドを使用して、リクエストに値が存在するかどうかを判別できます。hasメソッドは、値がリクエストに存在する場合にtrueを返します。
1if ($request->has('name')) {2 // ...3}
配列が指定されると、hasメソッドは指定されたすべての値が存在するかどうかを判別します。
1if ($request->has(['name', 'email'])) {2 // ...3}
hasAnyメソッドは、指定された値のいずれかが存在する場合にtrueを返します。
1if ($request->hasAny(['name', 'email'])) {2 // ...3}
whenHasメソッドは、リクエストに値が存在する場合に指定されたクロージャを実行します。
1$request->whenHas('name', function (string $input) {2 // ...3});
whenHasメソッドに2番目のクロージャを渡すことができ、これは指定された値がリクエストに存在しない場合に実行されます。
1$request->whenHas('name', function (string $input) {2 // The "name" value is present...3}, function () {4 // The "name" value is not present...5});
リクエストに値が存在し、かつ空の文字列でないかどうかを判別したい場合は、filledメソッドを使用できます。
1if ($request->filled('name')) {2 // ...3}
値がリクエストから欠落しているか、空の文字列であるかを判断したい場合は、isNotFilledメソッドを使用できます。
1if ($request->isNotFilled('name')) {2 // ...3}
配列を指定すると、isNotFilledメソッドは、指定されたすべての値が欠落しているか空であるかを判断します。
1if ($request->isNotFilled(['name', 'email'])) {2 // ...3}
anyFilledメソッドは、指定された値のいずれかが空の文字列でない場合にtrueを返します。
1if ($request->anyFilled(['name', 'email'])) {2 // ...3}
whenFilledメソッドは、リクエストに値が存在し、かつ空の文字列でない場合に指定されたクロージャを実行します。
1$request->whenFilled('name', function (string $input) {2 // ...3});
whenFilledメソッドに2番目のクロージャを渡すことができ、これは指定された値が「入力されていない」場合に実行されます。
1$request->whenFilled('name', function (string $input) {2 // The "name" value is filled...3}, function () {4 // The "name" value is not filled...5});
指定されたキーがリクエストに存在しないかどうかを判断するには、missingメソッドとwhenMissingメソッドを使用できます。
1if ($request->missing('name')) {2 // ...3}4 5$request->whenMissing('name', function () {6 // The "name" value is missing...7}, function () {8 // The "name" value is present...9});
追加入力のマージ
リクエストの既存の入力データに追加の入力を手動でマージする必要がある場合があります。これを実現するには、mergeメソッドを使用できます。指定された入力キーがリクエストにすでに存在する場合、それはmergeメソッドに提供されたデータで上書きされます。
1$request->merge(['votes' => 0]);
mergeIfMissingメソッドを使用して、対応するキーがリクエストの入力データにまだ存在しない場合に入力をリクエストにマージできます。
1$request->mergeIfMissing(['votes' => 0]);
直前の入力
Laravelでは、あるリクエストから次のリクエストまで入力を保持できます。この機能は、検証エラーを検出した後にフォームを再入力する場合に特に便利です。ただし、Laravelに含まれている検証機能を使用している場合は、Laravelの組み込み検証機能の一部がこれらのセッション入力フラッシュメソッドを自動的に呼び出すため、手動で使用する必要はないかもしれません。
セッションへの入力のフラッシュ
Illuminate\Http\Requestクラスのflashメソッドは、現在の入力をセッションにフラッシュし、ユーザーがアプリケーションへの次のリクエスト中に利用できるようにします。
1$request->flash();
flashOnlyメソッドとflashExceptメソッドを使用して、リクエストデータのサブセットをセッションにフラッシュすることもできます。これらのメソッドは、パスワードなどの機密情報をセッションから除外するのに役立ちます。
1$request->flashOnly(['username', 'email']);2 3$request->flashExcept('password');
入力のフラッシュとリダイレクト
多くの場合、セッションに入力をフラッシュしてから前のページにリダイレクトしたいため、withInputメソッドを使用してリダイレクトに入力フラッシュを簡単にチェーンできます。
1return redirect('/form')->withInput();2 3return redirect()->route('user.create')->withInput();4 5return redirect('/form')->withInput(6 $request->except('password')7);
直前の入力の取得
前のリクエストからフラッシュされた入力を取得するには、Illuminate\Http\Requestのインスタンスでoldメソッドを呼び出します。oldメソッドは、以前にフラッシュされた入力データをセッションから取得します。
1$username = $request->old('username');
Laravelはグローバルなoldヘルパも提供しています。Bladeテンプレート内で直前の入力を表示している場合は、oldヘルパを使用してフォームを再入力する方が便利です。指定されたフィールドに直前の入力が存在しない場合、nullが返されます。
1<input type="text" name="username" value="{{ old('username') }}">
クッキー
リクエストからのCookieの取得
Laravelフレームワークによって作成されたすべてのCookieは暗号化され、認証コードで署名されています。つまり、クライアントによって変更された場合、それらは無効と見なされます。リクエストからCookieの値を取得するには、Illuminate\Http\Requestインスタンスでcookieメソッドを使用します。
1$value = $request->cookie('name');
入力のトリムと正規化
デフォルトでは、LaravelはアプリケーションのグローバルミドルウェアスタックにIlluminate\Foundation\Http\Middleware\TrimStringsおよびIlluminate\Foundation\Http\Middleware\ConvertEmptyStringsToNullミドルウェアを含んでいます。これらのミドルウェアは、リクエスト上のすべての受信文字列フィールドを自動的にトリムし、空の文字列フィールドをnullに変換します。これにより、ルートやコントローラでこれらの正規化の懸念について心配する必要がなくなります。
入力正規化の無効化
すべてのリクエストに対してこの動作を無効にしたい場合は、アプリケーションのbootstrap/app.phpファイルで$middleware->removeメソッドを呼び出すことにより、アプリケーションのミドルウェアスタックから2つのミドルウェアを削除できます。
1use Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull;2use Illuminate\Foundation\Http\Middleware\TrimStrings;3 4->withMiddleware(function (Middleware $middleware) {5 $middleware->remove([6 ConvertEmptyStringsToNull::class,7 TrimStrings::class,8 ]);9})
アプリケーションへのリクエストのサブセットに対して文字列のトリミングと空文字列の変換を無効にしたい場合は、アプリケーションのbootstrap/app.phpファイル内でtrimStringsおよびconvertEmptyStringsToNullミドルウェアメソッドを使用できます。どちらのメソッドもクロージャの配列を受け入れ、これは入力の正規化をスキップすべきかどうかを示すためにtrueまたはfalseを返す必要があります。
1->withMiddleware(function (Middleware $middleware) {2 $middleware->convertEmptyStringsToNull(except: [3 fn (Request $request) => $request->is('admin/*'),4 ]);5 6 $middleware->trimStrings(except: [7 fn (Request $request) => $request->is('admin/*'),8 ]);9})
ファイル
アップロードファイルの取得
Illuminate\Http\Requestインスタンスからアップロードされたファイルを取得するには、fileメソッドまたは動的プロパティを使用します。fileメソッドは、PHPのSplFileInfoクラスを拡張し、ファイルと対話するためのさまざまなメソッドを提供するIlluminate\Http\UploadedFileクラスのインスタンスを返します。
1$file = $request->file('photo');2 3$file = $request->photo;
リクエストにファイルが存在するかどうかは、hasFileメソッドを使用して判別できます。
1if ($request->hasFile('photo')) {2 // ...3}
アップロード成功の検証
ファイルが存在するかどうかを確認することに加えて、isValidメソッドを介してファイルのアップロードに問題がなかったことを確認できます。
1if ($request->file('photo')->isValid()) {2 // ...3}
ファイルパスと拡張子
UploadedFileクラスには、ファイルの完全修飾パスとその拡張子にアクセスするためのメソッドも含まれています。extensionメソッドは、その内容に基づいてファイルの拡張子を推測しようとします。この拡張子は、クライアントによって提供された拡張子とは異なる場合があります。
1$path = $request->photo->path();2 3$extension = $request->photo->extension();
その他のファイルメソッド
UploadedFileインスタンスで利用できるさまざまなメソッドがあります。これらのメソッドに関する詳細については、クラスのAPIドキュメントを確認してください。
アップロードファイルの保存
アップロードされたファイルを保存するには、通常、設定済みのファイルシステムの1つを使用します。UploadedFileクラスにはstoreメソッドがあり、アップロードされたファイルをディスクの1つに移動します。これは、ローカルファイルシステムの場所、またはAmazon S3のようなクラウドストレージの場所である可能性があります。
storeメソッドは、ファイルシステムの構成されたルートディレクトリを基準としてファイルが保存されるべきパスを受け入れます。このパスにはファイル名を含めるべきではありません。ファイル名として機能する一意のIDが自動的に生成されるためです。
storeメソッドは、ファイルの保存に使用するディスクの名前のオプションの第2引数も受け入れます。このメソッドは、ディスクのルートに対するファイルのパスを返します。
1$path = $request->photo->store('images');2 3$path = $request->photo->store('images', 's3');
ファイル名を自動的に生成したくない場合は、storeAsメソッドを使用できます。これは、引数としてパス、ファイル名、およびディスク名を受け入れます。
1$path = $request->photo->storeAs('images', 'filename.jpg');2 3$path = $request->photo->storeAs('images', 'filename.jpg', 's3');
Laravelでのファイルストレージの詳細については、完全なファイルストレージのドキュメントを確認してください。
信頼するプロキシの設定
TLS/SSL証明書を終端するロードバランサの背後でアプリケーションを実行している場合、urlヘルパを使用すると、アプリケーションがHTTPSリンクを生成しないことがあることに気付くかもしれません。通常、これはアプリケーションがポート80でロードバランサからトラフィックを転送されており、セキュアなリンクを生成すべきであることを知らないためです。
これを解決するには、Laravelアプリケーションに含まれているIlluminate\Http\Middleware\TrustProxiesミドルウェアを有効にすることができます。これにより、アプリケーションが信頼すべきロードバランサまたはプロキシを迅速にカスタマイズできます。信頼するプロキシは、アプリケーションのbootstrap/app.phpファイル内のtrustProxiesミドルウェアメソッドを使用して指定する必要があります。
1->withMiddleware(function (Middleware $middleware) {2 $middleware->trustProxies(at: [3 '192.168.1.1',4 '10.0.0.0/8',5 ]);6})
信頼するプロキシを構成することに加えて、信頼すべきプロキシヘッダも構成できます。
1->withMiddleware(function (Middleware $middleware) {2 $middleware->trustProxies(headers: Request::HEADER_X_FORWARDED_FOR |3 Request::HEADER_X_FORWARDED_HOST |4 Request::HEADER_X_FORWARDED_PORT |5 Request::HEADER_X_FORWARDED_PROTO |6 Request::HEADER_X_FORWARDED_AWS_ELB7 );8})
AWS Elastic Load Balancingを使用している場合、headersの値はRequest::HEADER_X_FORWARDED_AWS_ELBである必要があります。ロードバランサがRFC 7239の標準的なForwardedヘッダを使用している場合、headersの値はRequest::HEADER_FORWARDEDである必要があります。headers値で使用できる定数の詳細については、Symfonyのプロキシの信頼に関するドキュメントを確認してください。
すべてのプロキシを信頼する
Amazon AWSまたは他の「クラウド」ロードバランサプロバイダを使用している場合、実際のバランサのIPアドレスがわからない場合があります。この場合、*を使用してすべてのプロキシを信頼できます。
1->withMiddleware(function (Middleware $middleware) {2 $middleware->trustProxies(at: '*');3})
信頼するホストの設定
デフォルトでは、LaravelはHTTPリクエストのHostヘッダの内容に関係なく、受信したすべてのリクエストに応答します。さらに、Hostヘッダの値は、Webリクエスト中にアプリケーションへの絶対URLを生成するときに使用されます。
通常、NginxやApacheなどのWebサーバを構成して、特定のホスト名に一致するリクエストのみをアプリケーションに送信するようにする必要があります。ただし、Webサーバを直接カスタマイズする機能がなく、Laravelに特定のホスト名にのみ応答するように指示する必要がある場合は、アプリケーションのIlluminate\Http\Middleware\TrustHostsミドルウェアを有効にすることで可能です。
TrustHostsミドルウェアを有効にするには、アプリケーションのbootstrap/app.phpファイルでtrustHostsミドルウェアメソッドを呼び出す必要があります。このメソッドのat引数を使用して、アプリケーションが応答すべきホスト名を指定できます。他のHostヘッダを持つ受信リクエストは拒否されます。
1->withMiddleware(function (Middleware $middleware) {2 $middleware->trustHosts(at: ['laravel.test']);3})
デフォルトでは、アプリケーションのURLのサブドメインからのリクエストも自動的に信頼されます。この動作を無効にしたい場合は、subdomains引数を使用できます。
1->withMiddleware(function (Middleware $middleware) {2 $middleware->trustHosts(at: ['laravel.test'], subdomains: false);3})
信頼するホストを決定するためにアプリケーションの構成ファイルやデータベースにアクセスする必要がある場合は、at引数にクロージャを提供できます。
1->withMiddleware(function (Middleware $middleware) {2 $middleware->trustHosts(at: fn () => config('app.trusted_hosts'));3})