Prologo
Primi Passi
Architettura
Le Basi
- Routing
- Middleware
- Protezione da CSRF
- Controller
- Richieste
- Risposte
- Views
- Blade
- Vite
- URL
- Sessioni
- Validazione
- Errori
- Logging
Approfondimenti
- Artisan
- Broadcasting
- Cache
- Collezioni
- Concorrenza
- Contesto
- Contratti
- Eventi
- File System
- Helpers
- Client HTTP
- Localizzazione
- Notifiche
- Sviluppo di Package
- Processi
- Code
- Rate-limiting
- Stringhe
- Scheduling di Task
Sicurezza
Database
Eloquent ORM
Testing
Package
Richieste
- Introduzione
- Interagire con la richiesta
- Input
- Trimming e Normalizzazione dell’Input
- File
- Configurare i Proxy Affidabili
- Configurazione degli Host di Fiducia
Introduzione
La classe Illuminate\Http\Request
di Laravel offre un approccio orientato agli oggetti per interagire con la richiesta HTTP corrente gestita dalla tua applicazione, oltre a recuperare input, cookie e file inviati con la richiesta.
Interagire con la richiesta
Accesso alla Richiesta
Per ottenere un’istanza della richiesta HTTP corrente tramite dependency injection, devi specificare il tipo della classe Illuminate\Http\Request
nella tua closure di route o nel metodo del controller. L’istanza della richiesta in arrivo sarà automaticamente iniettata dal service container di Laravel:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* Salva un nuovo utente.
*/
public function store(Request $request): RedirectResponse
{
$name = $request->input('name');
// Salva l'utente...
return redirect('/users');
}
}
Come accennato, puoi anche specificare il tipo della classe Illuminate\Http\Request
in una closure di route. Il service container inietterà automaticamente la richiesta in arrivo nella closure quando verrà eseguita:
use Illuminate\Http\Request;
Route::get('/', function (Request $request) {
// ...
});
Iniezione delle Dipendenze e Parametri
Se il tuo metodo del controller si aspetta anche input da un parametro di route, dovresti elencare i parametri di route dopo le altre dipendenze. Ad esempio, se la tua route è definita così:
use App\Http\Controllers\UserController;
Route::put('/user/{id}', [UserController::class, 'update']);
Puoi comunque usare il type-hint Illuminate\Http\Request
e accedere al parametro di route id
definendo il metodo del tuo controller nel seguente modo:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* Aggiorna l'utente specificato.
*/
public function update(Request $request, string $id): RedirectResponse
{
// Aggiorna l'utente...
return redirect('/users');
}
}
Percorso, Host e Metodo della Richiesta
L’istanza Illuminate\Http\Request
fornisce vari metodi per esaminare la richiesta HTTP in arrivo ed estende la classe Symfony\Component\HttpFoundation\Request
. Di seguito discuteremo alcuni dei metodi più importanti.
Recuperare il Percorso della Richiesta
Il metodo path
restituisce le informazioni del percorso della richiesta. Quindi, se la richiesta arriva a http://example.com/foo/bar
, il metodo path
restituirà foo/bar
:
$uri = $request->path();
Ispezionare il Percorso della Richiesta / Route
Il metodo is
ti permette di verificare che il percorso della richiesta in arrivo corrisponda a un determinato pattern. Puoi usare il carattere *
come jolly quando utilizzi questo metodo:
if ($request->is('admin/*')) {
// ...
}
Usando il metodo routeIs
, puoi determinare se la richiesta in arrivo corrisponde ad una route nominata:
if ($request->routeIs('admin.*')) {
// ...
}
Recuperare l’URL della Richiesta
Per ottenere l’URL completo della richiesta in arrivo, puoi usare i metodi url
o fullUrl
. Il metodo url
restituisce l’URL senza la stringa di query, mentre fullUrl
include la stringa di query:
$url = $request->url();
$urlWithQueryString = $request->fullUrl();
Se desideri aggiungere dati alla stringa di query all’URL corrente, puoi chiamare il metodo fullUrlWithQuery
. Questo metodo unisce l’array fornito di variabili della stringa di query con quella corrente:
$request->fullUrlWithQuery(['type' => 'phone']);
Se vuoi ottenere l’URL corrente senza un determinato parametro della stringa di query, puoi utilizzare il metodo fullUrlWithoutQuery
:
$request->fullUrlWithoutQuery(['type']);
Ottenere l’Host della Richiesta
Puoi ottenere l’"host" della richiesta in arrivo tramite i metodi host
, httpHost
e schemeAndHttpHost
:
$request->host();
$request->httpHost();
$request->schemeAndHttpHost();
Recuperare il Metodo della Richiesta
Il metodo method
restituisce il verbo HTTP della richiesta. Puoi usare il metodo isMethod
per verificare che il verbo HTTP corrisponda a una stringa specifica:
$method = $request->method();
if ($request->isMethod('post')) {
// ...
}
Header della Richiesta
Puoi ottenere un header dalla richiesta usando il metodo header
sull’istanza di Illuminate\Http\Request
. Se l’header non è presente, verrà restituito null
. Tuttavia, il metodo header
accetta un secondo argomento opzionale che verrà restituito se l’header non è presente:
$value = $request->header('X-Header-Name');
$value = $request->header('X-Header-Name', 'default');
Il metodo hasHeader
può essere utilizzato per verificare se la richiesta contiene un determinato header:
if ($request->hasHeader('X-Header-Name')) {
// ...
}
Per comodità, il metodo bearerToken
può essere usato per ottenere un token bearer dall’header Authorization
. Se nessun header di questo tipo è presente, verrà restituita una stringa vuota:
$token = $request->bearerToken();
Richiedere l’indirizzo IP
Il metodo ip
può essere utilizzato per ottenere l’indirizzo IP del client che ha effettuato la richiesta alla tua applicazione:
$ipAddress = $request->ip();
Se desideri ottenere un array di indirizzi IP, inclusi tutti gli indirizzi IP del client inoltrati dai proxy, puoi utilizzare il metodo ips
. L’indirizzo IP "originale" del client sarà alla fine dell’array:
$ipAddresses = $request->ips();
In generale, gli indirizzi IP dovrebbero essere considerati input non affidabili e controllati dall’utente, e usati solo a scopo informativo.
Tipo dei Contenuti
Laravel fornisce diversi metodi per ispezionare i tipi di contenuto richiesti dalla richiesta in ingresso tramite l’intestazione Accept
. Innanzitutto, il metodo getAcceptableContentTypes
restituirà un array contenente tutti i tipi di contenuto accettati dalla richiesta:
$contentTypes = $request->getAcceptableContentTypes();
Il metodo accepts
accetta un array di tipi di contenuto e restituisce true
se uno qualsiasi dei tipi di contenuto è accettato dalla richiesta. Altrimenti, verrà restituito false
:
if ($request->accepts(['text/html', 'application/json'])) {
// ...
}
Puoi usare il metodo prefers
per determinare quale tipo di contenuto, tra quelli forniti, è più preferito dalla richiesta. Se nessuno dei tipi di contenuto forniti è accettato dalla richiesta, verrà restituito null
:
$preferred = $request->prefers(['text/html', 'application/json']);
Poiché molte applicazioni servono solo HTML o JSON, puoi usare il metodo expectsJson
per verificare rapidamente se la richiesta in ingresso si aspetta una risposta JSON:
if ($request->expectsJson()) {
// ...
}
Richieste PSR-7
Lo standard PSR-7 specifica le interfacce per i messaggi HTTP, comprese richieste e risposte. Se desideri ottenere un’istanza di una richiesta PSR-7 invece di una richiesta Laravel, devi prima installare alcune librerie. Laravel utilizza il componente Symfony HTTP Message Bridge per convertire le solite richieste e risposte Laravel in implementazioni compatibili con PSR-7:
composer require symfony/psr-http-message-bridge
composer require nyholm/psr7
Una volta installate queste librerie, puoi ottenere una richiesta PSR-7 specificando l’interfaccia della richiesta nel tuo closure di rotta o nel metodo del controller:
use Psr\Http\Message\ServerRequestInterface;
Route::get('/', function (ServerRequestInterface $request) {
// ...
});
Se ritorni un’istanza di risposta PSR-7 da una rotta o da un controller, verrà automaticamente convertita nuovamente in un’istanza di risposta Laravel e mostrata dal framework.
Input
Recuperare Input
Recuperare Tutti i Dati di Input
Puoi ottenere tutti i dati di input della richiesta in arrivo come un array
usando il metodo all
. Questo metodo può essere utilizzato sia che la richiesta provenga da un modulo HTML o sia una richiesta XHR:
$input = $request->all();
Usando il metodo collect
, puoi ottenere tutti i dati di input della richiesta in arrivo come una collection:
$input = $request->collect();
Il metodo collect
permette anche di ottenere un sottoinsieme dei dati di input della richiesta in arrivo come una collection:
$request->collect('users')->each(function (string $user) {
// ...
});
Recuperare un Valore di Input
Con alcuni semplici metodi, puoi accedere a tutti i dati inseriti dall’utente tramite la tua istanza Illuminate\Http\Request
senza preoccuparti del verbo HTTP utilizzato per la richiesta. Indipendentemente dal verbo HTTP, puoi usare il metodo input
per recuperare i dati dell’utente:
$name = $request->input('name');
Puoi passare un valore di default come secondo argomento al metodo input
. Questo valore sarà restituito se il valore di input richiesto non è presente nella richiesta:
$name = $request->input('name', 'Sally');
Quando lavori con form che contengono input array, usa la notazione "dot" per accedere agli array:
$name = $request->input('products.0.name');
$names = $request->input('products.*.name');
Puoi chiamare il metodo input
senza argomenti per recuperare tutti i valori di input come un array associativo:
$input = $request->input();
Recuperare Input dalla Query String
Mentre il metodo input
recupera i valori da tutto il payload della richiesta (inclusa la query string), il metodo query
recupera solo i valori dalla query string:
$name = $request->query('name');
Se il valore della query string richiesto non è presente, verrà restituito il secondo argomento di questo metodo:
$name = $request->query('name', 'Helen');
Puoi chiamare il metodo query
senza argomenti per recuperare tutti i valori della query string come un array associativo:
$query = $request->query();
Recuperare i Valori di Input JSON
Quando invii richieste JSON alla tua applicazione, puoi accedere ai dati JSON tramite il metodo input
, a condizione che l’intestazione Content-Type
della richiesta sia impostata correttamente su application/json
. Puoi anche usare la sintassi a punti per recuperare valori annidati all’interno di array/oggetti JSON:
$name = $request->input('user.name');
Recuperare Valori di Stringhe
Invece di recuperare i dati di input della richiesta come una string
primitiva, puoi usare il metodo string
per ottenere i dati della richiesta come un’istanza di Illuminate\Support\Stringable
:
$name = $request->string('name')->trim();
Recuperare valori di input interi
Per ottenere valori di input come interi, puoi usare il metodo integer
. Questo metodo tenterà di convertire il valore di input in un intero. Se il input non è presente o la conversione fallisce, restituirà il valore predefinito che specifichi. Questo è particolarmente utile per la paginazione o altri input numerici:
$perPage = $request->integer('per_page');
Recupero di Valori Booleani dagli Input
Quando si lavora con elementi HTML come checkbox, la tua applicazione può ricevere valori "truthy" che in realtà sono stringhe. Per esempio, "true" o "on". Per comodità, puoi utilizzare il metodo boolean
per ottenere questi valori come booleani. Il metodo boolean
restituisce true
per 1, "1", true, "true", "on" e "yes". Tutti gli altri valori restituiranno false
:
$archived = $request->boolean('archived');
Recuperare i Valori di Input Data
Per comodità, i valori di input contenenti date/ore possono essere recuperati come istanze di Carbon usando il metodo date
. Se la richiesta non contiene un valore di input con il nome fornito, verrà restituito null
:
$birthday = $request->date('birthday');
Il secondo e il terzo argomento accettati dal metodo date
possono essere utilizzati per specificare rispettivamente il formato della data e il fuso orario:
$elapsed = $request->date('elapsed', '!H:i', 'Europe/Madrid');
Se il valore di input è presente ma ha un formato non valido, verrà lanciata una InvalidArgumentException
; pertanto, si raccomanda di validare l’input prima di invocare il metodo date
.
Recupero dei Valori Enum dall’Input
I valori di input che corrispondono a PHP enums possono essere ottenuti dalla richiesta. Se la richiesta non include un valore di input con il nome indicato oppure se l’enum non ha un valore corrispondente, verrà restituito null
. Il metodo enum
prende il nome del valore di input e la classe enum come primo e secondo parametro:
use App\Enums\Status;
$status = $request->enum('status', Status::class);
Se il valore di input è un array di valori che corrispondono a un PHP enum, puoi utilizzare il metodo enums
per ottenere l’array di valori come istanze enum:
use App\Enums\Product;
$products = $request->enums('products', Product::class);
Recuperare Input tramite Proprietà Dinamiche
Puoi anche accedere ai dati inviati dall’utente utilizzando le proprietà dinamiche sull’istanza di Illuminate\Http\Request
. Ad esempio, se uno dei form della tua applicazione contiene un campo name
, puoi accedere al valore del campo in questo modo:
$name = $request->name;
Quando usi le proprietà dinamiche, Laravel cercherà prima il valore del parametro nel payload della richiesta. Se non è presente, Laravel cercherà il campo nei parametri della route corrispondente.
Recuperare una Parte dei Dati di Input
Se hai bisogno di recuperare un sottoinsieme dei dati di input, puoi usare i metodi only
ed except
. Entrambi questi metodi accettano un singolo array
o una lista di argomenti dinamica:
$input = $request->only(['username', 'password']);
$input = $request->only('username', 'password');
$input = $request->except(['credit_card']);
$input = $request->except('credit_card');
Il metodo
only
restituisce tutte le coppie chiave/valore che richiedi; tuttavia, non restituirà coppie chiave/valore che non sono presenti nella richiesta.
Presenza dell’Input
Puoi utilizzare il metodo has
per determinare se un valore è presente nella richiesta. Il metodo has
restituisce true
se il valore è presente nella richiesta:
if ($request->has('name')) {
// ...
}
Quando viene fornito un array, il metodo has
verificherà se tutti i valori specificati sono presenti:
if ($request->has(['name', 'email'])) {
// ...
}
Il metodo hasAny
restituisce true
se almeno uno dei valori specificati è presente:
if ($request->hasAny(['name', 'email'])) {
// ...
}
Il metodo whenHas
eseguirà la closure fornita se un valore è presente nella richiesta:
$request->whenHas('name', function (string $input) {
// ...
});
Può essere passata una seconda closure al metodo whenHas
che verrà eseguita se il valore specificato non è presente nella richiesta:
$request->whenHas('name', function (string $input) {
// Il valore "name" è presente...
}, function () {
// Il valore "name" non è presente...
});
Se desideri determinare se un valore è presente nella richiesta e non è una stringa vuota, puoi utilizzare il metodo filled
:
if ($request->filled('name')) {
// ...
}
Se desideri determinare se un valore manca nella richiesta o è una stringa vuota, puoi utilizzare il metodo isNotFilled
:
if ($request->isNotFilled('name')) {
// ...
}
Quando viene fornito un array, il metodo isNotFilled
verificherà se tutti i valori specificati mancano o sono vuoti:
if ($request->isNotFilled(['name', 'email'])) {
// ...
}
Il metodo anyFilled
restituisce true
se almeno uno dei valori specificati non è una stringa vuota:
if ($request->anyFilled(['name', 'email'])) {
// ...
}
Il metodo whenFilled
eseguirà la closure fornita se un valore è presente nella richiesta e non è una stringa vuota:
$request->whenFilled('name', function (string $input) {
// ...
});
Può essere passata una seconda closure al metodo whenFilled
che verrà eseguita se il valore specificato non è "filled":
$request->whenFilled('name', function (string $input) {
// Il valore "name" è pieno...
}, function () {
// Il valore "name" non è pieno...
});
Per determinare se una chiave data è assente dalla richiesta, puoi utilizzare i metodi missing
e whenMissing
:
if ($request->missing('name')) {
// ...
}
$request->whenMissing('name', function () {
// Il valore "name" manca...
}, function () {
// Il valore "name" è presente...
});
Unione di Input Aggiuntivo
A volte potresti aver bisogno di unire manualmente input aggiuntivo ai dati di input esistenti della richiesta. Per farlo, puoi usare il metodo merge
. Se una chiave di input esiste già nella richiesta, verrà sovrascritta dai dati forniti al metodo merge
:
$request->merge(['votes' => 0]);
Il metodo mergeIfMissing
può essere utilizzato per unire input nella richiesta se le chiavi corrispondenti non esistono già nei dati di input della richiesta:
$request->mergeIfMissing(['votes' => 0]);
Input Precedente
Laravel ti permette di mantenere l’input da una richiesta durante la successiva. Questa funzionalità è particolarmente utile per ripopolare i moduli dopo aver rilevato errori di validazione. Tuttavia, se stai usando le funzionalità di validazione di Laravel, potrebbe non essere necessario utilizzare manualmente questi metodi di flashing degli input della sessione, poiché alcune delle funzionalità di validazione integrate di Laravel li usano automaticamente.
Memorizzazione Temporanea dell’Input nella Sessione
Il metodo flash
della classe Illuminate\Http\Request
salva temporaneamente l’input corrente nella sessione in modo che sia disponibile durante la prossima richiesta dell’utente all’applicazione:
$request->flash();
Puoi anche utilizzare i metodi flashOnly
e flashExcept
per salvare temporaneamente solo una parte dei dati della richiesta nella sessione. Questi metodi sono utili per mantenere informazioni sensibili come le password fuori dalla sessione:
$request->flashOnly(['username', 'email']);
$request->flashExcept('password');
Memorizzare l’Input e Reindirizzare
Poiché spesso vorrai memorizzare temporaneamente i dati di input nella sessione e poi reindirizzare alla pagina precedente, puoi facilmente concatenare la memorizzazione dell’input a un redirect usando il metodo withInput
:
return redirect('/form')->withInput();
return redirect()->route('user.create')->withInput();
return redirect('/form')->withInput(
$request->except('password')
);
Recupero dell’Input Precedente
Per recuperare gli input inviati nella richiesta precedente, chiama il metodo old
su un’istanza di Illuminate\Http\Request
. Il metodo old
preleverà i dati di input inviati precedentemente dalla session:
$username = $request->old('username');
Laravel fornisce anche un helper globale old
. Se stai visualizzando input passati all’interno di un template Blade, è più comodo usare l’helper old
per ripopolare il form. Se non esiste un vecchio input per il campo dato, verrà restituito null
:
<input type="text" name="username" value="{{ old('username') }}">
Cookie
Recuperare i Cookie dalle Richieste
Tutti i cookie creati dal framework Laravel sono criptati e firmati con un codice di autenticazione, il che significa che saranno considerati invalidi se modificati dal client. Per recuperare il valore di un cookie dalla richiesta, usa il metodo cookie
su un’istanza di Illuminate\Http\Request
:
$value = $request->cookie('name');
Trimming e Normalizzazione dell’Input
Per impostazione predefinita, Laravel include i middleware Illuminate\Foundation\Http\Middleware\TrimStrings
e Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull
nello stack dei middleware globali dell’applicazione. Questi middleware automaticamente rimuovono gli spazi da tutti i campi di tipo stringa in arrivo nella richiesta e convertono eventuali campi stringa vuoti in null
. In questo modo, non devi preoccuparti di queste operazioni di normalizzazione nelle tue rotte e controller.
Disabilitare la Normalizzazione dell’Input
Se desideri disabilitare questo comportamento per tutte le richieste, puoi rimuovere i due middleware dallo stack dei middleware della tua applicazione invocando il metodo $middleware->remove
nel file bootstrap/app.php
della tua applicazione:
use Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull;
use Illuminate\Foundation\Http\Middleware\TrimStrings;
->withMiddleware(function (Middleware $middleware) {
$middleware->remove([
ConvertEmptyStringsToNull::class,
TrimStrings::class,
]);
})
Se desideri disabilitare il trimming delle stringhe e la conversione delle stringhe vuote per un sottoinsieme di richieste alla tua applicazione, puoi utilizzare i metodi middleware trimStrings
e convertEmptyStringsToNull
nel file bootstrap/app.php
della tua applicazione. Entrambi i metodi accettano un array di closures, che devono restituire true
o false
per indicare se la normalizzazione dell’input deve essere saltata:
->withMiddleware(function (Middleware $middleware) {
$middleware->convertEmptyStringsToNull(except: [
fn (Request $request) => $request->is('admin/*'),
]);
$middleware->trimStrings(except: [
fn (Request $request) => $request->is('admin/*'),
]);
})
File
Recuperare File Caricati
Puoi recuperare i file caricati da un’istanza di Illuminate\Http\Request
utilizzando il metodo file
oppure le proprietà dinamiche. Il metodo file
restituisce un’istanza della classe Illuminate\Http\UploadedFile
, che estende la classe PHP SplFileInfo
e fornisce vari metodi per interagire con il file:
$file = $request->file('photo');
$file = $request->photo;
Puoi verificare se un file è presente nella richiesta usando il metodo hasFile
:
if ($request->hasFile('photo')) {
// ...
}
Validare i Caricamenti Riusciti
Oltre a verificare che il file sia presente, puoi controllare che non ci siano stati problemi nel caricamento del file tramite il metodo isValid
:
if ($request->file('photo')->isValid()) {
// ...
}
Percorsi e Estensioni dei File
La classe UploadedFile
contiene anche metodi per accedere al percorso completo del file e alla sua estensione. Il metodo extension
cercherà di determinare l’estensione del file in base al suo contenuto. Questa estensione potrebbe essere diversa da quella fornita dal client:
$path = $request->photo->path();
$extension = $request->photo->extension();
Altri Metodi per i File
Ci sono diversi altri metodi disponibili sulle istanze UploadedFile
. Consulta la documentazione API della classe per maggiori informazioni su questi metodi.
Salvataggio dei File Caricati
Per salvare un file caricato, solitamente utilizzerai uno dei tuoi filesystems configurati. La classe UploadedFile
dispone di un metodo store
che sposterà un file caricato su uno dei tuoi dischi, che può essere una posizione sul filesystem locale o un servizio di cloud storage come Amazon S3.
Il metodo store
accetta il percorso in cui il file deve essere salvato relativo alla directory root configurata del filesystem. Questo percorso non deve includere un nome file, poiché verrà generato automaticamente un ID univoco come nome del file.
Il metodo store
accetta anche un secondo argomento opzionale per il nome del disco che deve essere utilizzato per salvare il file. Il metodo restituirà il percorso del file relativo alla radice del disco:
$path = $request->photo->store('images');
$path = $request->photo->store('images', 's3');
Se non desideri che venga generato automaticamente un nome file, puoi utilizzare il metodo storeAs
, che accetta come argomenti il percorso, il nome del file e il nome del disco:
$path = $request->photo->storeAs('images', 'filename.jpg');
$path = $request->photo->storeAs('images', 'filename.jpg', 's3');
Per ulteriori informazioni sul salvataggio dei file in Laravel, consulta la completa documentazione sul salvataggio dei file.
Configurare i Proxy Affidabili
Quando esegui le tue applicazioni dietro un load balancer che si occupa dei certificati TLS / SSL, potresti notare che la tua applicazione a volte non genera link HTTPS quando usi l’helper url
. Di solito questo accade perché il traffico viene inoltrato dal load balancer sulla porta 80 e l’applicazione non sa che deve generare link sicuri.
Per risolvere questo problema, puoi abilitare il middleware Illuminate\Http\Middleware\TrustProxies
incluso nella tua applicazione Laravel, che ti permette di personalizzare rapidamente i bilanciatori di carico o i proxy a cui la tua applicazione deve affidarsi. I tuoi proxy devono essere specificati usando il metodo trustProxies
nel file bootstrap/app.php
della tua applicazione:
->withMiddleware(function (Middleware $middleware) {
$middleware->trustProxies(at: [
'192.168.1.1',
'10.0.0.0/8',
]);
})
Oltre a configurare i proxy fidati, puoi anche configurare le intestazioni del proxy a cui affidarti:
->withMiddleware(function (Middleware $middleware) {
$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
);
})
Se stai usando AWS Elastic Load Balancing, il valore di
headers
dovrebbe essereRequest::HEADER_X_FORWARDED_AWS_ELB
. Se il tuo bilanciatore di carico utilizza l’intestazione standardForwarded
secondo RFC 7239, il valore diheaders
dovrebbe essereRequest::HEADER_FORWARDED
. Per maggiori informazioni sulle costanti che possono essere usate nel valoreheaders
, consulta la documentazione di Symfony su affidarsi ai proxy.
Fidarsi di tutti i proxy
Se stai usando Amazon AWS o un altro fornitore di load balancer "cloud", potresti non conoscere gli indirizzi IP effettivi. In questo caso, puoi usare *
per aprire a tutti i proxy:
->withMiddleware(function (Middleware $middleware) {
$middleware->trustProxies(at: '*');
})
Configurazione degli Host di Fiducia
Per impostazione predefinita, Laravel risponde a tutte le richieste che riceve indipendentemente dal contenuto dell’intestazione Host
della richiesta HTTP. Inoltre, il valore dell’intestazione Host
verrà utilizzato durante la generazione di URL assoluti per la tua applicazione durante una richiesta web.
Tipicamente, dovresti configurare il tuo server web, come Nginx o Apache, per inviare solo le richieste alla tua applicazione che corrispondono a un determinato hostname. Tuttavia, se non hai la possibilità di personalizzare direttamente il tuo server web e hai bisogno di istruire Laravel a rispondere solo a determinati nomi host, puoi farlo abilitando il middleware Illuminate\Http\Middleware\TrustHosts
per la tua applicazione.
Per abilitare il middleware TrustHosts
, devi invocare il metodo trustHosts
nel file bootstrap/app.php
della tua applicazione. Utilizzando l’argomento at
di questo metodo, puoi specificare gli hostnames a cui la tua applicazione deve rispondere. Le richieste in arrivo con altri valori dell’intestazione Host
saranno rifiutate:
->withMiddleware(function (Middleware $middleware) {
$middleware->trustHosts(at: ['laravel.test']);
})
Per impostazione predefinita, le richieste provenienti da sottodomini dell’URL dell’applicazione sono automaticamente considerate affidabili. Se desideri disabilitare questo comportamento, puoi utilizzare l’argomento subdomains
:
->withMiddleware(function (Middleware $middleware) {
$middleware->trustHosts(at: ['laravel.test'], subdomains: false);
})
Se hai bisogno di accedere ai file di configurazione o al database della tua applicazione per determinare gli host di fiducia, puoi fornire una closure all’argomento at
:
->withMiddleware(function (Middleware $middleware) {
$middleware->trustHosts(at: fn () => config('app.trusted_hosts'));
})