Запити — Laravel
Клас Laravel Illuminate\Http\Request дає обʼєктно-орієнтований спосіб працювати з поточним HTTP-запитом, який обробляє ваш застосунок, а також отримувати вхідні дані, cookie й файли, надіслані разом із запитом.
Взаємодія із запитом
Доступ до запиту
Щоб отримати екземпляр поточного HTTP-запиту через впровадження залежностей, вкажіть тип Illuminate\Http\Request у замиканні маршруту або методі контролера. Вхідний екземпляр запиту буде автоматично впроваджено контейнером сервісів Laravel:
<?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');
}
}
Як уже згадано, ви також можете вказати тип Illuminate\Http\Request у замиканні маршруту. Контейнер сервісів автоматично впровадить вхідний запит у замикання під час його виконання:
use Illuminate\Http\Request;
Route::get('/', function (Request $request) {
// ...
});
Впровадження залежностей і параметри маршруту
Якщо ваш метод контролера також очікує вхідні дані з параметра маршруту, перелічуйте параметри маршруту після інших залежностей. Наприклад, якщо ваш маршрут визначено так:
use App\Http\Controllers\UserController;
Route::put('/user/{id}', [UserController::class, 'update']);
Ви все одно можете вказати тип Illuminate\Http\Request і отримати доступ до параметра маршруту id, визначивши метод контролера так:
<?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');
}
}
Шлях, хост і метод запиту
Екземпляр Illuminate\Http\Request надає різноманітні методи для дослідження вхідного HTTP-запиту й розширює клас Symfony\Component\HttpFoundation\Request. Нижче ми розглянемо кілька найважливіших методів.
Отримання шляху запиту
Метод path повертає інформацію про шлях запиту. Отже, якщо вхідний запит спрямовано на http://example.com/foo/bar, метод path поверне foo/bar:
$uri = $request->path();
Перевірка шляху запиту / маршруту
Метод is дозволяє перевірити, чи шлях вхідного запиту збігається із заданим шаблоном. Використовуючи цей метод, ви можете застосовувати символ * як підстановлювальний знак:
if ($request->is('admin/*')) {
// ...
}
За допомогою методу routeIs ви можете визначити, чи вхідний запит збігся з іменованим маршрутом:
if ($request->routeIs('admin.*')) {
// ...
}
Отримання URL запиту
Щоб отримати повний URL вхідного запиту, ви можете скористатися методами url або fullUrl. Метод url поверне URL без рядка запиту (query string), а метод fullUrl включає рядок запиту:
$url = $request->url();
$urlWithQueryString = $request->fullUrl();
Якщо ви хочете додати дані рядка запиту до поточного URL, ви можете викликати метод fullUrlWithQuery. Цей метод обʼєднує заданий масив змінних рядка запиту з поточним рядком запиту:
$request->fullUrlWithQuery(['type' => 'phone']);
Якщо ви хочете отримати поточний URL без заданого параметра рядка запиту, ви можете скористатися методом fullUrlWithoutQuery:
$request->fullUrlWithoutQuery(['type']);
Отримання хоста запиту
Ви можете отримати «хост» вхідного запиту через методи host, httpHost і schemeAndHttpHost:
// http://localhost:8000
$request->host(); // localhost
$request->httpHost(); // localhost:8000
$request->schemeAndHttpHost(); // http://localhost:8000
Отримання методу запиту
Метод method поверне HTTP-дієслово запиту. Ви можете скористатися методом isMethod, щоб перевірити, чи HTTP-дієслово збігається із заданим рядком:
$method = $request->method();
if ($request->isMethod('post')) {
// ...
}
Заголовки запиту
Ви можете отримати заголовок запиту з екземпляра Illuminate\Http\Request за допомогою методу header. Якщо заголовка немає в запиті, буде повернено null. Проте метод header приймає необовʼязковий другий аргумент, який буде повернено, якщо заголовка немає в запиті:
$value = $request->header('X-Header-Name');
$value = $request->header('X-Header-Name', 'default');
Метод hasHeader можна використати, щоб визначити, чи запит містить заданий заголовок:
if ($request->hasHeader('X-Header-Name')) {
// ...
}
Для зручності метод bearerToken можна використати, щоб отримати bearer-токен із заголовка Authorization. Якщо такого заголовка немає, буде повернено порожній рядок:
$token = $request->bearerToken();
IP-адреса запиту
Метод ip можна використати, щоб отримати IP-адресу клієнта, який зробив запит до вашого застосунку:
$ipAddress = $request->ip();
Якщо ви хочете отримати масив IP-адрес, включно з усіма IP-адресами клієнта, переданими проксі-серверами, ви можете скористатися методом ips. «Оригінальна» IP-адреса клієнта буде в кінці масиву:
$ipAddresses = $request->ips();
Загалом IP-адреси слід вважати недовіреними, контрольованими користувачем вхідними даними й використовувати лише для інформаційних цілей.
Узгодження вмісту
Laravel надає кілька методів для перевірки типів вмісту, які запитує вхідний запит, через заголовок Accept. По-перше, метод getAcceptableContentTypes поверне масив, що містить усі типи вмісту, які приймає запит:
$contentTypes = $request->getAcceptableContentTypes();
Метод accepts приймає масив типів вмісту й повертає true, якщо будь-який із цих типів вмісту приймається запитом. Інакше буде повернено false:
if ($request->accepts(['text/html', 'application/json'])) {
// ...
}
Ви можете скористатися методом prefers, щоб визначити, який тип вмісту із заданого масиву типів вмісту є найпріоритетнішим для запиту. Якщо жоден із наданих типів вмісту не приймається запитом, буде повернено null:
$preferred = $request->prefers(['text/html', 'application/json']);
Оскільки багато застосунків віддають лише HTML або JSON, ви можете скористатися методом expectsJson, щоб швидко визначити, чи вхідний запит очікує JSON-відповідь:
if ($request->expectsJson()) {
// ...
}
Якщо вам потрібно визначити, чи запит спеціально надає перевагу Markdown або чи прийме Markdown серед інших типів вмісту — наприклад, коли ви обслуговуєте AI-агентів чи інших клієнтів, які споживають Markdown-відповіді, — ви можете скористатися методами wantsMarkdown і acceptsMarkdown:
if ($request->wantsMarkdown()) {
// Найпріоритетніший тип вмісту клієнта — text/markdown...
}
if ($request->acceptsMarkdown()) {
// Клієнт приймає Markdown-відповіді...
}
PSR-7 запити
Стандарт PSR-7 визначає інтерфейси для HTTP-повідомлень, включно із запитами й відповідями. Якщо ви хочете отримати екземпляр PSR-7 запиту замість запиту Laravel, вам спершу потрібно встановити кілька бібліотек. Laravel використовує компонент Symfony HTTP Message Bridge для перетворення типових запитів і відповідей Laravel на PSR-7-сумісні реалізації:
composer require symfony/psr-http-message-bridge
composer require nyholm/psr7
Після встановлення цих бібліотек ви можете отримати PSR-7 запит, вказавши тип інтерфейсу запиту в замиканні маршруту або методі контролера:
use Psr\Http\Message\ServerRequestInterface;
Route::get('/', function (ServerRequestInterface $request) {
// ...
});
Примітка Якщо ви повернете екземпляр PSR-7 відповіді з маршруту або контролера, його буде автоматично перетворено назад на екземпляр відповіді Laravel і відображено фреймворком.
Вхідні дані
Отримання вхідних даних
Отримання всіх вхідних даних
Ви можете отримати всі вхідні дані запиту як array за допомогою методу all. Цей метод можна використовувати незалежно від того, чи надійшов вхідний запит із HTML-форми, чи це XHR-запит:
$input = $request->all();
За допомогою методу collect ви можете отримати всі вхідні дані запиту як колекцію:
$input = $request->collect();
Метод collect також дозволяє отримати підмножину вхідних даних запиту у вигляді колекції:
$request->collect('users')->each(function (string $user) {
// ...
});
Отримання значення вхідних даних
За допомогою кількох простих методів ви можете отримати доступ до всіх користувацьких вхідних даних із вашого екземпляра Illuminate\Http\Request, не переймаючись тим, яке HTTP-дієслово було використане для запиту. Незалежно від HTTP-дієслова, метод input можна використати, щоб отримати користувацькі вхідні дані:
$name = $request->input('name');
Ви можете передати значення за замовчуванням другим аргументом методу input. Це значення буде повернено, якщо запитуваного вхідного значення немає в запиті:
$name = $request->input('name', 'Sally');
Працюючи з формами, що містять масиви вхідних даних, використовуйте «крапкову» нотацію для доступу до масивів:
$name = $request->input('products.0.name');
$names = $request->input('products.*.name');
Ви можете викликати метод input без жодних аргументів, щоб отримати всі вхідні значення як асоціативний масив:
$input = $request->input();
Отримання вхідних даних із рядка запиту
Тоді як метод input отримує значення з усього корисного навантаження запиту (включно з рядком запиту), метод query отримує значення лише з рядка запиту:
$name = $request->query('name');
Якщо запитуваних даних значення рядка запиту немає, буде повернено другий аргумент цього методу:
$name = $request->query('name', 'Helen');
Ви можете викликати метод query без жодних аргументів, щоб отримати всі значення рядка запиту як асоціативний масив:
$query = $request->query();
Отримання JSON-значень вхідних даних
Надсилаючи JSON-запити до вашого застосунку, ви можете отримати доступ до JSON-даних через метод input, доки заголовок Content-Type запиту правильно встановлено в application/json. Ви навіть можете використовувати «крапковий» синтаксис, щоб отримати значення, вкладені в JSON-масиви / обʼєкти:
$name = $request->input('user.name');
Отримання вхідних значень як Stringable
Замість отримання вхідних даних запиту як примітивного string, ви можете скористатися методом string, щоб отримати дані запиту як екземпляр Illuminate\Support\Stringable:
$name = $request->string('name')->trim();
Отримання цілочисельних вхідних значень
Щоб отримати вхідні значення як цілі числа, ви можете скористатися методом integer. Цей метод спробує привести вхідне значення до цілого числа. Якщо вхідних даних немає або приведення не вдається, він поверне вказане вами значення за замовчуванням. Це особливо корисно для пагінації чи інших числових вхідних даних:
$perPage = $request->integer('per_page');
Отримання булевих вхідних значень
Працюючи з HTML-елементами на кшталт чекбоксів, ваш застосунок може отримувати «правдиві» значення, які насправді є рядками. Наприклад, "true" або "on". Для зручності ви можете скористатися методом boolean, щоб отримати ці значення як булеві. Метод boolean повертає true для 1, "1", true, "true", "on" і "yes". Усі інші значення повернуть false:
$archived = $request->boolean('archived');
Отримання масивів вхідних значень
Вхідні значення, що містять масиви, можна отримати за допомогою методу array. Цей метод завжди приводить вхідне значення до масиву. Якщо запит не містить вхідного значення із заданим імʼям, буде повернено порожній масив:
$versions = $request->array('versions');
Отримання вхідних значень із датами
Для зручності вхідні значення, що містять дати / час, можна отримати як екземпляри Carbon за допомогою методу date. Якщо запит не містить вхідного значення із заданим імʼям, буде повернено null:
$birthday = $request->date('birthday');
Другий і третій аргументи, які приймає метод date, можна використати, щоб вказати відповідно формат дати й часовий пояс:
$elapsed = $request->date('elapsed', '!H:i', 'Europe/Madrid');
Якщо вхідне значення присутнє, але має некоректний формат, буде викинуто InvalidArgumentException; тому рекомендується валідувати вхідні дані перед викликом методу date.
Отримання вхідних значень з інтервалами
Вхідні значення, що містять тривалості, можна отримати як екземпляри CarbonInterval за допомогою методу interval. Якщо запит не містить вхідного значення із заданим імʼям, буде повернено null:
$duration = $request->interval('duration');
Якщо вхідне значення числове, ви можете передати одиницю виміру другим аргументом. Одиницею може бути рядок на кшталт second, minute або day, чи екземпляр переліку (enum) Carbon\Unit:
use Carbon\Unit;
$timeout = $request->interval('timeout', 'second');
$delay = $request->interval('delay', Unit::Minute);
Якщо вхідне значення присутнє, але має некоректний формат, буде викинуто InvalidArgumentException; тому рекомендується валідувати вхідні дані перед викликом методу interval.
Отримання вхідних значень як переліків (enum)
Вхідні значення, що відповідають перелікам (enum) PHP, також можна отримати із запиту. Якщо запит не містить вхідного значення із заданим імʼям або перелік не має backing-значення, яке збігається з вхідним значенням, буде повернено null. Метод enum приймає імʼя вхідного значення й клас переліку як перший і другий аргументи:
use App\Enums\Status;
$status = $request->enum('status', Status::class);
Ви також можете надати значення за замовчуванням, яке буде повернено, якщо значення відсутнє або некоректне:
$status = $request->enum('status', Status::class, Status::Pending);
Якщо вхідне значення — це масив значень, що відповідають переліку PHP, ви можете скористатися методом enums, щоб отримати масив значень як екземпляри переліку:
use App\Enums\Product;
$products = $request->enums('products', Product::class);
Отримання вхідних даних через динамічні властивості
Ви також можете отримати доступ до користувацьких вхідних даних за допомогою динамічних властивостей екземпляра Illuminate\Http\Request. Наприклад, якщо одна з форм вашого застосунку містить поле name, ви можете отримати доступ до значення цього поля так:
$name = $request->name;
Використовуючи динамічні властивості, Laravel спершу шукатиме значення параметра в корисному навантаженні запиту. Якщо його там немає, Laravel шукатиме поле серед параметрів маршруту, що збігся.
Отримання частини вхідних даних
Якщо вам потрібно отримати підмножину вхідних даних, ви можете скористатися методами only і except. Обидва ці методи приймають один array або динамічний список аргументів:
$input = $request->only(['username', 'password']);
$input = $request->only('username', 'password');
$input = $request->except(['credit_card']);
$input = $request->except('credit_card');
Попередження Метод
onlyповертає всі пари ключ / значення, які ви запитуєте; проте він не поверне пари ключ / значення, яких немає в запиті.
Наявність вхідних даних
Ви можете скористатися методом has, щоб визначити, чи значення присутнє в запиті. Метод has повертає true, якщо значення присутнє в запиті:
if ($request->has('name')) {
// ...
}
Якщо передати масив, метод has визначить, чи присутні всі вказані значення:
if ($request->has(['name', 'email'])) {
// ...
}
Метод hasAny повертає true, якщо присутнє будь-яке з указаних значень:
if ($request->hasAny(['name', 'email'])) {
// ...
}
Метод whenHas виконає задане замикання, якщо значення присутнє в запиті:
$request->whenHas('name', function (string $input) {
// ...
});
Методу whenHas можна передати друге замикання, яке буде виконано, якщо вказаного значення немає в запиті:
$request->whenHas('name', function (string $input) {
// Значення "name" присутнє...
}, function () {
// Значення "name" відсутнє...
});
Якщо ви хочете визначити, чи значення присутнє в запиті й не є порожнім рядком, ви можете скористатися методом filled:
if ($request->filled('name')) {
// ...
}
Якщо ви хочете визначити, чи значення відсутнє в запиті або є порожнім рядком, ви можете скористатися методом isNotFilled:
if ($request->isNotFilled('name')) {
// ...
}
Якщо передати масив, метод isNotFilled визначить, чи всі вказані значення відсутні або порожні:
if ($request->isNotFilled(['name', 'email'])) {
// ...
}
Метод anyFilled повертає true, якщо будь-яке з указаних значень не є порожнім рядком:
if ($request->anyFilled(['name', 'email'])) {
// ...
}
Метод whenFilled виконає задане замикання, якщо значення присутнє в запиті й не є порожнім рядком:
$request->whenFilled('name', function (string $input) {
// ...
});
Методу whenFilled можна передати друге замикання, яке буде виконано, якщо вказане значення не є «заповненим»:
$request->whenFilled('name', function (string $input) {
// Значення "name" заповнене...
}, function () {
// Значення "name" не заповнене...
});
Щоб визначити, чи заданий ключ відсутній у запиті, ви можете скористатися методами missing і whenMissing:
if ($request->missing('name')) {
// ...
}
$request->whenMissing('name', function () {
// Значення "name" відсутнє...
}, function () {
// Значення "name" присутнє...
});
Обʼєднання додаткових вхідних даних
Іноді вам може знадобитися вручну обʼєднати додаткові вхідні дані з наявними вхідними даними запиту. Щоб це зробити, ви можете скористатися методом merge. Якщо заданий ключ вхідних даних уже існує в запиті, він буде перезаписаний даними, переданими методу merge:
$request->merge(['votes' => 0]);
Метод mergeIfMissing можна використати, щоб обʼєднати вхідні дані із запитом, якщо відповідних ключів ще немає у вхідних даних запиту:
$request->mergeIfMissing(['votes' => 0]);
Старі вхідні дані
Laravel дозволяє зберігати вхідні дані з одного запиту протягом наступного запиту. Ця можливість особливо корисна для повторного заповнення форм після виявлення помилок валідації. Проте, якщо ви користуєтеся вбудованими можливостями валідації Laravel, цілком можливо, що вам не доведеться вручну використовувати ці методи флеш-запису вхідних даних у сесію, оскільки деякі вбудовані засоби валідації Laravel викликають їх автоматично.
Флеш-запис вхідних даних у сесію
Метод flash класу Illuminate\Http\Request виконає флеш-запис поточних вхідних даних у сесію, щоб вони були доступні під час наступного запиту користувача до застосунку:
$request->flash();
Ви також можете скористатися методами flashOnly і flashExcept, щоб виконати флеш-запис підмножини даних запиту в сесію. Ці методи корисні для того, щоб тримати конфіденційну інформацію на кшталт паролів поза сесією:
$request->flashOnly(['username', 'email']);
$request->flashExcept('password');
Флеш-запис вхідних даних із подальшим перенаправленням
Оскільки часто вам захочеться виконати флеш-запис вхідних даних у сесію, а потім перенаправити на попередню сторінку, ви можете легко приєднати флеш-запис вхідних даних до перенаправлення за допомогою методу withInput:
return redirect('/form')->withInput();
return redirect()->route('user.create')->withInput();
return redirect('/form')->withInput(
$request->except('password')
);
Отримання старих вхідних даних
Щоб отримати вхідні дані, записані флешем із попереднього запиту, викличте метод old на екземплярі Illuminate\Http\Request. Метод old витягне раніше записані флешем вхідні дані із сесії:
$username = $request->old('username');
Laravel також надає глобальний хелпер old. Якщо ви відображаєте старі вхідні дані в шаблоні Blade, зручніше скористатися хелпером old, щоб повторно заповнити форму. Якщо для заданого поля старих вхідних даних немає, буде повернено null:
<input type="text" name="username" value="{{ old('username') }}">
Cookie
Отримання cookie із запитів
Усі cookie, створені фреймворком Laravel, зашифровані й підписані кодом автентифікації, а отже вважатимуться недійсними, якщо їх було змінено клієнтом. Щоб отримати значення cookie із запиту, скористайтеся методом cookie на екземплярі Illuminate\Http\Request:
$value = $request->cookie('name');
Обрізання й нормалізація вхідних даних
За замовчуванням Laravel включає middleware Illuminate\Foundation\Http\Middleware\TrimStrings і Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull до глобального стека middleware вашого застосунку. Ці middleware автоматично обрізають усі вхідні рядкові поля запиту, а також перетворюють будь-які порожні рядкові поля на null. Це дозволяє вам не перейматися питаннями нормалізації у ваших маршрутах і контролерах.
Вимкнення нормалізації вхідних даних
Якщо ви хочете вимкнути цю поведінку для всіх запитів, ви можете видалити ці два middleware зі стека middleware вашого застосунку, викликавши метод $middleware->remove у файлі bootstrap/app.php вашого застосунку:
use Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull;
use Illuminate\Foundation\Http\Middleware\TrimStrings;
->withMiddleware(function (Middleware $middleware): void {
$middleware->remove([
ConvertEmptyStringsToNull::class,
TrimStrings::class,
]);
})
Якщо ви хочете вимкнути обрізання рядків і перетворення порожніх рядків для підмножини запитів до вашого застосунку, ви можете скористатися методами middleware trimStrings і convertEmptyStringsToNull у файлі bootstrap/app.php вашого застосунку. Обидва методи приймають масив замикань, які мають повертати true або false, щоб указати, чи слід пропустити нормалізацію вхідних даних:
->withMiddleware(function (Middleware $middleware): void {
$middleware->convertEmptyStringsToNull(except: [
fn (Request $request) => $request->is('admin/*'),
]);
$middleware->trimStrings(except: [
fn (Request $request) => $request->is('admin/*'),
]);
})
Файли
Отримання завантажених файлів
Ви можете отримати завантажені файли з екземпляра Illuminate\Http\Request за допомогою методу file або через динамічні властивості. Метод file повертає екземпляр класу Illuminate\Http\UploadedFile, який розширює PHP-клас SplFileInfo і надає різноманітні методи для роботи з файлом:
$file = $request->file('photo');
$file = $request->photo;
Ви можете визначити, чи файл присутній у запиті, за допомогою методу hasFile:
if ($request->hasFile('photo')) {
// ...
}
Якщо завантажений файл — це зображення, яке вам потрібно обробити перед збереженням, ви можете скористатися методом image, щоб отримати екземпляр Illuminate\Image\Image, або null, якщо файл відсутній:
$image = $request->image('photo');
Докладніше про обробку зображень читайте в повній документації з обробки зображень.
Валідація успішних завантажень
Окрім перевірки наявності файлу, ви можете переконатися, що під час завантаження файлу не було проблем, за допомогою методу isValid:
if ($request->file('photo')->isValid()) {
// ...
}
Шляхи й розширення файлів
Клас UploadedFile також містить методи для доступу до повного шляху файлу та його розширення. Метод extension спробує вгадати розширення файлу на основі його вмісту. Це розширення може відрізнятися від розширення, наданого клієнтом:
$path = $request->photo->path();
$extension = $request->photo->extension();
Інші методи для файлів
На екземплярах UploadedFile доступні різноманітні інші методи. Перегляньте документацію API цього класу, щоб дізнатися більше про ці методи.
Збереження завантажених файлів
Щоб зберегти завантажений файл, ви зазвичай використовуватимете одну з ваших налаштованих файлових систем. Клас UploadedFile має метод store, який перемістить завантажений файл на один із ваших дисків, що може бути розташуванням у вашій локальній файловій системі або хмарним сховищем на кшталт Amazon S3.
Метод store приймає шлях, за яким має бути збережено файл, відносно налаштованої кореневої теки файлової системи. Цей шлях не повинен містити імені файлу, оскільки унікальний ID буде згенеровано автоматично, щоб слугувати іменем файлу.
Метод store також приймає необовʼязковий другий аргумент — імʼя диска, який має бути використаний для збереження файлу. Метод поверне шлях до файлу відносно кореня диска:
$path = $request->photo->store('images');
$path = $request->photo->store('images', 's3');
Якщо ви не хочете, щоб імʼя файлу генерувалося автоматично, ви можете скористатися методом storeAs, який приймає шлях, імʼя файлу й імʼя диска як свої аргументи:
$path = $request->photo->storeAs('images', 'filename.jpg');
$path = $request->photo->storeAs('images', 'filename.jpg', 's3');
Примітка Докладніше про зберігання файлів у Laravel читайте в повній документації зі зберігання файлів.
Налаштування довірених проксі
Коли ваш застосунок працює за балансувальником навантаження, який термінує TLS / SSL-сертифікати, ви можете помітити, що ваш застосунок іноді не генерує HTTPS-посилання під час використання хелпера url. Зазвичай це відбувається тому, що трафік передається вашому застосунку від балансувальника навантаження на порт 80, і він не знає, що має генерувати безпечні посилання.
Щоб це вирішити, ви можете увімкнути middleware Illuminate\Http\Middleware\TrustProxies, включений до вашого застосунку Laravel, який дозволяє швидко налаштувати балансувальники навантаження чи проксі, яким має довіряти ваш застосунок. Ваші довірені проксі слід указати за допомогою методу middleware trustProxies у файлі bootstrap/app.php вашого застосунку:
->withMiddleware(function (Middleware $middleware): void {
$middleware->trustProxies(at: [
'192.168.1.1',
'10.0.0.0/8',
]);
})
Окрім налаштування довірених проксі, ви також можете налаштувати заголовки проксі, яким слід довіряти:
->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. Якщо ваш балансувальник навантаження використовує стандартний заголовокForwardedіз RFC 7239, значеннямheadersмає бутиRequest::HEADER_FORWARDED. Докладніше про константи, які можна використовувати у значенніheaders, читайте в документації Symfony про довіру до проксі.
Довіра до всіх проксі
Якщо ви користуєтеся Amazon AWS або іншим «хмарним» провайдером балансувальників навантаження, ви можете не знати IP-адрес ваших фактичних балансувальників. У цьому випадку ви можете використати *, щоб довіряти всім проксі:
->withMiddleware(function (Middleware $middleware): void {
$middleware->trustProxies(at: '*');
})
Налаштування довірених хостів
За замовчуванням Laravel відповідатиме на всі запити, які отримує, незалежно від вмісту заголовка Host HTTP-запиту. Крім того, значення заголовка Host буде використано під час генерації абсолютних URL до вашого застосунку під час веб-запиту.
Зазвичай вам слід налаштувати ваш вебсервер, наприклад Nginx чи Apache, так, щоб він надсилав вашому застосунку лише запити, які збігаються із заданим імʼям хоста. Проте, якщо ви не маєте можливості налаштувати вебсервер безпосередньо й вам потрібно вказати Laravel відповідати лише на певні імена хостів, ви можете зробити це, увімкнувши для вашого застосунку middleware Illuminate\Http\Middleware\TrustHosts.
Щоб увімкнути middleware TrustHosts, вам слід викликати метод middleware trustHosts у файлі bootstrap/app.php вашого застосунку. За допомогою аргументу at цього методу ви можете вказати імена хостів, на які має відповідати ваш застосунок. Рядок імені хоста обробляється як регулярний вираз. Вхідні запити з іншими заголовками Host буде відхилено:
->withMiddleware(function (Middleware $middleware): void {
$middleware->trustHosts(at: ['^laravel\.test$']);
})
За замовчуванням запити, що надходять із піддоменів URL застосунку, також автоматично вважаються довіреними. Якщо ви хочете вимкнути цю поведінку, ви можете скористатися аргументом subdomains:
->withMiddleware(function (Middleware $middleware): void {
$middleware->trustHosts(at: ['^laravel\.test$'], subdomains: false);
})
Якщо вам потрібен доступ до конфігураційних файлів або бази даних вашого застосунку, щоб визначити довірені хости, ви можете передати замикання в аргумент at:
->withMiddleware(function (Middleware $middleware): void {
$middleware->trustHosts(at: fn () => config('app.trusted_hosts'));
})
Виправити терміни, дописати розділ або взяти нову главу може кожен. Термінологію узгоджуємо в глосарії, щоб переклад лишався однорідним.