本文へ移動
Laravel Tips

リクエスト(送られてきたデータ)

ブラウザから届いたリクエストの中身を、Request クラスで取り出す方法を説明します。URL・ヘッダー・入力・Cookie・ファイルの扱いと、信頼するプロキシの設定まで引けます。

リクエストは、ブラウザがサーバーへ送る「お願い」のことです。どのページがほしいか、フォームに何を入力したか、どんな種類のデータを受け取れるか、といった情報が入っています。Laravel の Illuminate\Http\Request クラスを使うと、いま処理しているリクエストから、入力・Cookie(ブラウザに保存される小さなデータ)・アップロードされたファイルなどを、メソッド(クラスの中の関数)で取り出せます。

リクエストを受け取る#

Request を手に入れる#

コントローラーのメソッドやルートのクロージャ(名前のない関数)の引数に Illuminate\Http\Request の型を書くと、サービスコンテナ(クラスを作って渡してくれる道具箱)が、いまのリクエストを自動で渡してくれます。これを依存性の注入といいます。

php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Store a new user.
     */
    public function store(Request $request): RedirectResponse
    {
        $name = $request->input('name');

        // ユーザーを保存する

        return redirect('/users');
    }
}

ルートのクロージャでも、同じように型を書けます。

php
use Illuminate\Http\Request;

Route::get('/', function (Request $request) {
    // ...
});

ルートパラメータもいっしょに受け取る#

ルートパラメータ(URL の {id} の部分)も受け取るときは、ほかの部品の後ろに並べます。たとえば、次のルートがあるとします。

php
use App\Http\Controllers\UserController;

Route::put('/user/{id}', [UserController::class, 'update']);

Request の型を書きながら id も受け取るには、次のようにします。

php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Update the specified user.
     */
    public function update(Request $request, string $id): RedirectResponse
    {
        // ユーザーを更新する

        return redirect('/users');
    }
}

パス・ホスト・メソッドを調べる#

Request は、Symfony\Component\HttpFoundation\Request クラスを引き継いで(継承して)いて、リクエストを調べるメソッドをたくさん持っています。大事なものを紹介します。

メソッド 説明
path URL のパス(foo/bar のような部分)を返す
is パスが、決めた形に合うか調べる(* が使える)
routeIs 名前を付けたルートに当たったか調べる
url クエリ文字列を除いた URL を返す
fullUrl クエリ文字列を含めた URL を返す
fullUrlWithQuery 今の URL に、クエリ文字列を足した URL を返す
fullUrlWithoutQuery 今の URL から、指定したクエリ文字列を除いた URL を返す
host ホスト名(ポートなし)を返す
httpHost ホスト名とポートを返す
schemeAndHttpHost http:// などの種類も含めたホストを返す
method HTTP メソッド(GET や POST)を返す
isMethod HTTP メソッドが、指定した文字か調べる

パスを取り出す#

path は、リクエストのパスを返します。http://example.com/foo/bar へのリクエストなら、foo/bar です。

php
$uri = $request->path();

パスやルートを調べる#

is は、パスが決めた形に合うかを調べます。* は「何でもよい」という意味です。

php
if ($request->is('admin/*')) {
    // ...
}

routeIs は、名前を付けたルートに当たったかを調べます。

php
if ($request->routeIs('admin.*')) {
    // ...
}

URL を取り出す#

URL 全体は、url か fullUrl で取れます。url はクエリ文字列(URL の ? 以降)を除き、fullUrl は含めます。

php
$url = $request->url();

$urlWithQueryString = $request->fullUrl();

いまの URL にクエリ文字列を足したいときは、fullUrlWithQuery です。渡した配列が、いまのクエリ文字列に合わさります。

php
$request->fullUrlWithQuery(['type' => 'phone']);

いまの URL から、あるクエリ文字列を除きたいときは、fullUrlWithoutQuery です。

php
$request->fullUrlWithoutQuery(['type']);

ホストを取り出す#

ホスト(サーバーの名前)は、host・httpHost・schemeAndHttpHost で取れます。

php
// http://localhost:8000
$request->host(); // localhost
$request->httpHost(); // localhost:8000
$request->schemeAndHttpHost(); // http://localhost:8000

HTTP メソッドを調べる#

method は、リクエストの HTTP メソッド(GET・POST など)を返します。isMethod は、それが指定した文字と同じかを調べます。

php
$method = $request->method();

if ($request->isMethod('post')) {
    // ...
}

ヘッダーを取り出す#

ヘッダーは、リクエストに付く「添え書き」です。header メソッドで取れます。なければ null が返ります。2つ目の引数を書くと、ないときにその値が返ります。

php
$value = $request->header('X-Header-Name');

$value = $request->header('X-Header-Name', 'default');
メソッド 説明
header ヘッダーの値を返す(なければ null、または2つ目の引数)
hasHeader そのヘッダーがあるか調べる
bearerToken Authorization ヘッダーから、ベアラートークン(通行証のような文字列)を取り出す

hasHeader は、あるヘッダーが付いているかを調べます。

php
if ($request->hasHeader('X-Header-Name')) {
    // ...
}

bearerToken は、Authorization ヘッダーからベアラートークンを取り出します。ヘッダーがなければ、空の文字が返ります。

php
$token = $request->bearerToken();

IP アドレスを取り出す#

ip は、リクエストを送ってきた相手の IP アドレス(ネットワーク上の住所のようなもの)を返します。

php
$ipAddress = $request->ip();

プロキシ(間に入る中継役)が転送した IP アドレスもまとめて配列で取りたいときは、ips を使います。「もとの」相手の IP アドレスは、配列の最後です。

php
$ipAddresses = $request->ips();

IP アドレスは、相手が書きかえることもできる値です。信用せず、参考の情報としてだけ使いましょう。

相手が受け取れる形を調べる(コンテントネゴシエーション)#

リクエストの Accept ヘッダーには、相手が受け取れるデータの種類が書かれています。これを調べるメソッドがあります。

メソッド 説明
getAcceptableContentTypes 相手が受け取れる種類を、配列で返す
accepts 挙げた種類のどれかを、相手が受け取れるか調べる
prefers 挙げた種類のうち、相手がいちばん望むものを返す(どれもだめなら null)
expectsJson 相手が JSON の答えを望んでいるか調べる
wantsMarkdown 相手がいちばん望むのが Markdown か調べる
acceptsMarkdown 相手が Markdown を受け取れるか調べる

getAcceptableContentTypes は、相手が受け取れる種類を、配列で返します。

php
$contentTypes = $request->getAcceptableContentTypes();

accepts は、種類の配列を受け取り、どれか1つでも相手が受け取れるなら true を返します。

php
if ($request->accepts(['text/html', 'application/json'])) {
    // ...
}

prefers は、渡した種類のうち、相手がいちばん望むものを返します。どれも受け取れないなら null です。

php
$preferred = $request->prefers(['text/html', 'application/json']);

HTML か JSON(データをやり取りするための文字の形式)しか返さないアプリが多いので、expectsJson で、JSON を望むリクエストかをすぐ調べられます。

php
if ($request->expectsJson()) {
    // ...
}

AI のエージェントなど、Markdown(見出しや箇条書きを記号で書く文字の形式)を読むクライアント(リクエストを送ってくる側のプログラム)に合わせたいときは、wantsMarkdown と acceptsMarkdown を使います。

php
if ($request->wantsMarkdown()) {
    // 相手がいちばん望む種類は text/markdown
}

if ($request->acceptsMarkdown()) {
    // 相手は Markdown を受け取れる
}

PSR-7 のリクエスト#

PSR-7 は、HTTP のリクエストとレスポンスの形を決めた、PHP の共通の決まりです。Laravel のリクエストではなく、PSR-7 のリクエストがほしいときは、先にライブラリを入れます。Laravel は、Symfony の HTTP Message Bridge という部品を使って、リクエストとレスポンスを PSR-7 の形に変えます。

bash
composer require symfony/psr-http-message-bridge
composer require nyholm/psr7

入れたら、ルートのクロージャやコントローラーのメソッドに、リクエストのインターフェイス(守るべきメソッドの決まり)の型を書きます。

php
use Psr\Http\Message\ServerRequestInterface;

Route::get('/', function (ServerRequestInterface $request) {
    // ...
});

補足

ルートやコントローラーから PSR-7 のレスポンスを返すと、自動で Laravel のレスポンスに戻されて表示されます。

入力を取り出す#

入力の取り出し方#

入力を全部取り出す#

all で、リクエストの入力を全部、配列で取れます。HTML のフォームからでも、XHR(JavaScript からの送信)でも使えます。

php
$input = $request->all();

collect なら、コレクション(配列を便利に扱う入れ物)で取れます。

php
$input = $request->collect();

collect は、入力の一部だけをコレクションで取ることもできます。

php
$request->collect('users')->each(function (string $user) {
    // ...
});

入力の取り出しに使うメソッドを、先に一覧にします。

メソッド 説明
all 入力を全部、配列で返す
collect 入力を、コレクションで返す
input 入力の値を返す(クエリ文字列や JSON も含む)
query クエリ文字列の値だけを返す
string 入力を、文字列を扱う入れ物(Stringable)で返す
integer 入力を、整数にして返す
boolean 入力を、真偽(trueかfalse)にして返す
array 入力を、配列にして返す
date 入力を、日付(Carbon)にして返す
interval 入力を、期間(CarbonInterval)にして返す
enum 入力を、Enum(決めた値だけを持つクラス)にして返す
enums 入力の配列を、Enum の配列にして返す
only 指定したキーの入力だけ返す
except 指定したキー以外の入力を返す

入力の値を1つ取り出す#

input を使うと、HTTP メソッドが何でも、入力を取れます。

php
$name = $request->input('name');

2つ目の引数に、ないときに返す値(初期値)を書けます。

php
$name = $request->input('name', 'Sally');

配列の入力があるフォームでは、ドット記法(. でつなぐ書き方)で取り出せます。

php
$name = $request->input('products.0.name');

$names = $request->input('products.*.name');

引数なしで呼ぶと、入力の値を全部、連想配列(名前と値の組の並び)で返します。

php
$input = $request->input();

クエリ文字列から取り出す#

input は、リクエスト全体(クエリ文字列を含む)から取ります。query は、クエリ文字列からだけ取ります。

php
$name = $request->query('name');

ないときは、2つ目の引数が返ります。

php
$name = $request->query('name', 'Helen');

引数なしで呼ぶと、クエリ文字列の値を、全部連想配列で返します。

php
$query = $request->query();

JSON の入力を取り出す#

JSON を送るときは、リクエストの Content-Type ヘッダーを application/json にしておけば、input で取れます。JSON の入れ子の中も、ドット記法で取れます。

php
$name = $request->input('user.name');

Stringable として取り出す#

string を使うと、入力が、ただの文字列ではなく、Illuminate\Support\Stringable の入れ物として返ります。文字をつないで加工できます。

php
$name = $request->string('name')->trim();

整数として取り出す#

integer は、入力を整数に変えて返します。入力がなければ、決めた初期値を返します。ページ送りなど、数の入力に便利です。

php
$perPage = $request->integer('per_page');

真偽として取り出す#

チェックボックスなどからは、"true" や "on" のような、文字の「真」が届くことがあります。boolean を使うと、これを true か false にして取れます。1・"1"・true・"true"・"on"・"yes" なら true で、それ以外は false です。

php
$archived = $request->boolean('archived');

配列として取り出す#

array は、入力を必ず配列にして返します。その名前の入力がなければ、空の配列です。

php
$versions = $request->array('versions');

日付として取り出す#

日付や時刻の入力は、date で Carbon(日付を扱うライブラリ)の入れ物として取れます。入力がなければ null です。

php
$birthday = $request->date('birthday');

2つ目と3つ目の引数で、日付の形式とタイムゾーン(地域の時刻)を決められます。

php
$elapsed = $request->date('elapsed', '!H:i', 'Europe/Madrid');

入力はあるのに形が正しくないときは、InvalidArgumentException(引数のまちがいを知らせるエラー)が起きます。date を呼ぶ前に、入力をチェックしておくことをすすめます。

期間として取り出す#

期間(どれだけの時間か)の入力は、interval で CarbonInterval の入れ物として取れます。入力がなければ null です。

php
$duration = $request->interval('duration');

入力が数字のときは、2つ目の引数に単位を書けます。単位は、second・minute・day などの文字か、Carbon\Unit の Enum です。

php
use Carbon\Unit;

$timeout = $request->interval('timeout', 'second');

$delay = $request->interval('delay', Unit::Minute);

入力はあるのに形が正しくないときは、InvalidArgumentException のエラーが起きます。interval を呼ぶ前に、入力をチェックしておくことをすすめます。

Enum として取り出す#

入力が、PHP の Enum の値に当たるなら、Enum として取れます。入力がないか、Enum に合う値がなければ、null が返ります。enum の1つ目に入力の名前、2つ目に Enum のクラスを書きます。

php
use App\Enums\Status;

$status = $request->enum('status', Status::class);

入力がないか、正しくないときに返す値も、3つ目に書けます。

php
$status = $request->enum('status', Status::class, Status::Pending);

入力が、Enum に当たる値の配列なら、enums で、Enum の配列として取れます。

php
use App\Enums\Product;

$products = $request->enums('products', Product::class);

動的なプロパティで取り出す#

Request のプロパティ(クラスの中の変数)のように書いても、入力が取れます。フォームに name の欄があれば、次のとおりです。

php
$name = $request->name;

このとき Laravel は、まず入力の中から探します。なければ、当たったルートのパラメータの中から探します。

入力の一部だけ取り出す#

一部だけほしいときは、only と except を使います。どちらも、配列でも、並べて書いてもかまいません。

php
$input = $request->only(['username', 'password']);

$input = $request->only('username', 'password');

$input = $request->except(['credit_card']);

$input = $request->except('credit_card');

注意

only は、頼んだキーのうち、リクエストにあるものだけを返します。リクエストにないキーは、結果に入りません。

入力があるか調べる#

入力があるかどうかを調べるメソッドの一覧です。

メソッド 説明
has 値があるか調べる(配列なら全部あるか)
hasAny 挙げた値のどれかがあるか調べる
whenHas 値があるときだけ、クロージャを動かす
filled 値があり、空の文字ではないか調べる
isNotFilled 値がないか、空の文字か調べる(配列なら全部そうか)
anyFilled 挙げた値のどれかが、空の文字ではないか調べる
whenFilled 値があり空でないときだけ、クロージャを動かす
missing その名前の入力が、ないか調べる
whenMissing 値がないときだけ、クロージャを動かす

has は、値があれば true を返します。

php
if ($request->has('name')) {
    // ...
}

配列を渡すと、挙げた値が全部あるかを調べます。

php
if ($request->has(['name', 'email'])) {
    // ...
}

hasAny は、挙げた値のどれかがあれば true です。

php
if ($request->hasAny(['name', 'email'])) {
    // ...
}

whenHas は、値があるときに、クロージャを動かします。

php
$request->whenHas('name', function (string $input) {
    // ...
});

2つ目のクロージャを渡すと、値がないときに、そちらが動きます。

php
$request->whenHas('name', function (string $input) {
    // "name" の値がある
}, function () {
    // "name" の値がない
});

値があり、しかも空の文字ではないか調べるなら、filled です。

php
if ($request->filled('name')) {
    // ...
}

値がないか、空の文字かを調べるなら、isNotFilled です。

php
if ($request->isNotFilled('name')) {
    // ...
}

配列を渡すと、挙げた値が全部、ないか空かを調べます。

php
if ($request->isNotFilled(['name', 'email'])) {
    // ...
}

anyFilled は、挙げた値のどれかが、空の文字でなければ true です。

php
if ($request->anyFilled(['name', 'email'])) {
    // ...
}

whenFilled は、値があり、空の文字ではないときに、クロージャを動かします。

php
$request->whenFilled('name', function (string $input) {
    // ...
});

2つ目のクロージャは、「埋まっていない」ときに動きます。

php
$request->whenFilled('name', function (string $input) {
    // "name" の値が入っている
}, function () {
    // "name" の値が入っていない
});

そのキーがリクエストにないことを調べるなら、missing と whenMissing です。

php
if ($request->missing('name')) {
    // ...
}

$request->whenMissing('name', function () {
    // "name" の値がない
}, function () {
    // "name" の値がある
});

入力を足す#

リクエストの入力に、自分で値を足したいときは、merge を使います。同じキーがすでにあると、merge で渡した値で上書きされます。

php
$request->merge(['votes' => 0]);

mergeIfMissing は、そのキーがまだないときだけ、足します。

php
$request->mergeIfMissing(['votes' => 0]);

前の入力を残す(old input)#

Laravel は、1つ前のリクエストの入力を、次のリクエストまで残せます。入力チェックでエラーになったとき、フォームに前の入力を入れ直すのに便利です。ただ、Laravel のバリデーション(入力のチェック)を使うなら、入力を残す処理をバリデーションが自動でしてくれることがあります。そのため、自分で書かなくて済むこともあります。

入力をセッションに残す#

flash は、いまの入力をセッション(同じ人のアクセスをまたいで情報を覚えておくしくみ)に残し、その人の次のリクエストで使えるようにします。

php
$request->flash();

一部だけ残すには、flashOnly と flashExcept を使います。パスワードのような大事な情報を、セッションに残さずに済みます。

php
$request->flashOnly(['username', 'email']);

$request->flashExcept('password');

入力を残して転送する#

入力を残して、前のページへ転送することが多いので、転送に withInput をつなげられます。

php
return redirect('/form')->withInput();

return redirect()->route('user.create')->withInput();

return redirect('/form')->withInput(
    $request->except('password')
);

前の入力を取り出す#

前のリクエストで残した入力は、Request の old で取り出します。セッションから取り出されます。

php
$username = $request->old('username');

どこからでも呼べる old のヘルパー関数もあります。Blade テンプレートでフォームに入れ直すなら、こちらが便利です。その欄の前の入力がなければ、null が返ります。

blade
<input type="text" name="username" value="{{ old('username') }}">

Laravel が作った Cookie は、すべて暗号化され、書きかえを見破るための印(署名)が付いています。ブラウザ側で書きかえられると、無効になります。Cookie の値は、Request の cookie で取り出します。

php
$value = $request->cookie('name');

入力の整え方(トリミングと正規化)#

Laravel には、全体にかかるミドルウェアとして、Illuminate\Foundation\Http\Middleware\TrimStrings と Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull が最初から入っています。前者は、送られてきた文字の前後の空白を取り除きます。後者は、空の文字を null に変えます。そのため、ルートやコントローラーで、こうした整えを気にしなくて済みます。

ミドルウェア 説明
TrimStrings 文字の前後の空白を取り除く
ConvertEmptyStringsToNull 空の文字を null に変える

整えないようにする#

すべてのリクエストでやめたいときは、bootstrap/app.php で $middleware->remove を呼び、2つのミドルウェアを外します。

php
use Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull;
use Illuminate\Foundation\Http\Middleware\TrimStrings;

->withMiddleware(function (Middleware $middleware): void {
    $middleware->remove([
        ConvertEmptyStringsToNull::class,
        TrimStrings::class,
    ]);
})

一部のリクエストだけやめたいときは、bootstrap/app.php で、trimStrings と convertEmptyStringsToNull を使います。どちらも、クロージャの配列を受け取ります。クロージャが true を返したリクエストでは、整えません。

php
->withMiddleware(function (Middleware $middleware): void {
    $middleware->convertEmptyStringsToNull(except: [
        fn (Request $request) => $request->is('admin/*'),
    ]);

    $middleware->trimStrings(except: [
        fn (Request $request) => $request->is('admin/*'),
    ]);
})

ファイル#

アップロードされたファイルを取り出す#

アップロードされたファイルは、file か、動的なプロパティで取り出します。file は、Illuminate\Http\UploadedFile クラスの実体を返します。このクラスは PHP の SplFileInfo を引き継いで(継承して)いて、ファイルを扱うメソッドがたくさんあります。

php
$file = $request->file('photo');

$file = $request->photo;

ファイルがあるかは、hasFile で調べます。

php
if ($request->hasFile('photo')) {
    // ...
}

アップロードされたのが画像で、保存の前に加工したいときは、image で、Illuminate\Image\Image の入れ物として取り出せます。ファイルがなければ null です。

php
$image = $request->image('photo');

画像の加工について、くわしくは画像の加工を見てください。

メソッド 説明
file アップロードされたファイル(UploadedFile)を返す
hasFile ファイルがあるか調べる
image 画像として扱う入れ物を返す(なければ null)
isValid アップロードが問題なく終わったか調べる
path ファイルの場所(パス)を返す
extension 中身から推測した拡張子を返す
store 決めたフォルダに、自動の名前で保存する
storeAs 決めたフォルダに、決めた名前で保存する

アップロードが成功したか調べる#

ファイルがあるかだけでなく、アップロードに問題がなかったかも、isValid で調べられます。

php
if ($request->file('photo')->isValid()) {
    // ...
}

ファイルの場所と拡張子#

UploadedFile は、ファイルの場所(パス)と拡張子(.jpg など)も取れます。extension は、ファイルの中身から拡張子を推測します。相手が付けた拡張子とは、ちがうこともあります。

php
$path = $request->photo->path();

$extension = $request->photo->extension();

そのほかのメソッド#

UploadedFile には、ほかにもたくさんのメソッドがあります。くわしくは、Symfony の UploadedFile クラスの API ドキュメントを見てください。

アップロードされたファイルを保存する#

保存には、ふつう、設定したファイルの保存先(ファイルの保存)の1つを使います。UploadedFile の store メソッドは、アップロードされたファイルを、ディスク(保存先の名前)の1つに移します。ディスクは、自分のパソコンの中でも、Amazon S3 のようなクラウドの保存先でもかまいません。

store には、保存先の、ルート(出発点)からのフォルダのパスを渡します。ファイル名は入れません。ファイル名には、重ならない ID が自動で付くからです。

2つ目の引数で、使うディスクの名前を決められます。返るのは、ディスクのルートからのファイルのパスです。

php
$path = $request->photo->store('images');

$path = $request->photo->store('images', 's3');

ファイル名を自動で付けたくないときは、storeAs です。パス・ファイル名・ディスク名を渡します。

php
$path = $request->photo->storeAs('images', 'filename.jpg');

$path = $request->photo->storeAs('images', 'filename.jpg', 's3');

補足

ファイルの保存のくわしいことは、ファイルの保存を見てください。

信頼するプロキシを決める#

TLS / SSL の証明書(HTTPS にするための証明)を、ロードバランサー(アクセスを分けてサーバーに送る装置)で処理していると、url ヘルパー関数(どこからでも呼べる便利な関数)が、HTTPS のリンクを作らないことがあります。これは、ロードバランサーが 80 番のポート(サーバーの受付の番号)でアプリへ転送しているため、アプリが「安全なリンクを作るべきだ」と分からないからです。

直すには、Laravel に最初から入っている Illuminate\Http\Middleware\TrustProxies ミドルウェアを使います。信頼するロードバランサーやプロキシを決められます。bootstrap/app.php の trustProxies メソッドの at に書きます。

php
->withMiddleware(function (Middleware $middleware): void {
    $middleware->trustProxies(at: [
        '192.168.1.1',
        '10.0.0.0/8',
    ]);
})

信頼するプロキシだけでなく、信頼するヘッダーも決められます。

php
->withMiddleware(function (Middleware $middleware): void {
    $middleware->trustProxies(headers: Request::HEADER_X_FORWARDED_FOR |
        Request::HEADER_X_FORWARDED_HOST |
        Request::HEADER_X_FORWARDED_PORT |
        Request::HEADER_X_FORWARDED_PROTO |
        Request::HEADER_X_FORWARDED_AWS_ELB
    );
})

補足

AWS の Elastic Load Balancing を使うなら、headers は Request::HEADER_X_FORWARDED_AWS_ELB にします。ロードバランサーが、RFC 7239 の標準の Forwarded ヘッダーを使うなら、Request::HEADER_FORWARDED にします。headers に使える定数については、Symfony の、プロキシを信頼する方法の説明を見てください。

すべてのプロキシを信頼する#

Amazon AWS などのクラウドのロードバランサーでは、実際の装置の IP アドレスが分からないことがあります。そのときは、* で、すべてのプロキシを信頼できます。

php
->withMiddleware(function (Middleware $middleware): void {
    $middleware->trustProxies(at: '*');
})

信頼するホストを決める#

Laravel は、ふつう、リクエストの Host ヘッダーが何であっても、届いたリクエストすべてに答えます。また、Web のリクエストの中で、アプリの絶対 URL(https:// から始まる完全な URL)を作るときに、Host ヘッダーの値が使われます。

ふつうは、Nginx や Apache などの Web サーバーで、決めたホスト名のリクエストだけをアプリに送るようにします。でも、Web サーバーを自分で変えられず、Laravel に特定のホスト名にだけ答えさせたいときは、Illuminate\Http\Middleware\TrustHosts ミドルウェアを有効にします。

有効にするには、bootstrap/app.php で trustHosts メソッドを呼びます。at に、答えるホスト名を書きます。ホスト名の文字は、正規表現(文字の並びのパターン)として扱われます。ほかの Host ヘッダーのリクエストは、断られます。

php
->withMiddleware(function (Middleware $middleware): void {
    $middleware->trustHosts(at: ['^laravel\.test$']);
})

最初から、アプリの URL のサブドメイン(example.com に対する shop.example.com のような別の名前)からのリクエストも、自動で信頼されます。やめるには、subdomains を使います。

php
->withMiddleware(function (Middleware $middleware): void {
    $middleware->trustHosts(at: ['^laravel\.test$'], subdomains: false);
})

信頼するホストを決めるのに、設定ファイルやデータベースを使いたいときは、at にクロージャを渡せます。

php
->withMiddleware(function (Middleware $middleware): void {
    $middleware->trustHosts(at: fn () => config('app.trusted_hosts'));
})

関連するページ#

公式ドキュメント(英語)

2026年10月5日時点の内容をもとに、日本語でまとめています。

ページの一覧