Skip to content

HTTP 요청

소개

Laravel의 Illuminate\Http\Request 클래스는 애플리케이션에서 처리 중인 현재 HTTP 요청과 상호 작용하고 요청과 함께 제출된 입력, 쿠키 및 파일을 검색하는 객체 지향적인 방법을 제공합니다.

요청과 상호작용

요청 접근

의존성 주입을 통해 현재 HTTP 요청의 인스턴스를 얻으려면 라우트 클로저 또는 컨트롤러 메서드에서 Illuminate\Http\Request 클래스를 타입 힌팅해야 합니다. 들어오는 요청 인스턴스는 Laravel 서비스 컨테이너에 의해 자동으로 주입됩니다.

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
 
class UserController extends Controller
{
/**
* 새 사용자 저장.
*/
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
{
/**
* 지정된 사용자 업데이트.
*/
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을 반환하고, fullUrl 메서드는 쿼리 문자열을 포함합니다.

$url = $request->url();
 
$urlWithQueryString = $request->fullUrl();

현재 URL에 쿼리 문자열 데이터를 추가하려면 fullUrlWithQuery 메서드를 호출할 수 있습니다. 이 메서드는 지정된 쿼리 문자열 변수 배열을 현재 쿼리 문자열과 병합합니다.

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

지정된 쿼리 문자열 매개변수 없이 현재 URL을 가져오려면 fullUrlWithoutQuery 메서드를 사용할 수 있습니다.

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

$request->fullUrlWithoutQuery(['type']); 는 현재 요청의 전체 URL에서 type 쿼리 파라미터를 제거한 URL을 반환합니다. Laravel 프레임워크에서 주로 사용되며, URL에서 특정 쿼리 파라미터를 제외하고 싶을 때 유용합니다.

요청 호스트 가져오기

host, httpHost, 그리고 schemeAndHttpHost 메서드를 통해 들어오는 요청의 "호스트"를 가져올 수 있습니다:

$request->host();
$request->httpHost();
$request->schemeAndHttpHost();

요청 메서드 가져오기

method 메서드는 요청에 대한 HTTP 동사를 반환합니다. isMethod 메서드를 사용하여 HTTP 동사가 주어진 문자열과 일치하는지 확인할 수 있습니다:

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

요청 헤더

header 메서드를 사용하여 Illuminate\Http\Request 인스턴스에서 요청 헤더를 가져올 수 있습니다. 요청에 헤더가 없으면 null이 반환됩니다. 그러나 header 메서드는 헤더가 요청에 없을 경우 반환될 선택적 두 번째 인수를 허용합니다:

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

hasHeader 메서드를 사용하여 요청에 주어진 헤더가 있는지 확인할 수 있습니다:

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

편의를 위해 bearerToken 메서드를 사용하여 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()) {
// ...
}

PSR-7 요청

PSR-7 표준은 요청과 응답을 포함한 HTTP 메시지에 대한 인터페이스를 지정합니다. Laravel 요청 대신 PSR-7 요청 인스턴스를 얻으려면 먼저 몇 가지 라이브러리를 설치해야 합니다. Laravel은 일반적인 Laravel 요청과 응답을 PSR-7 호환 구현으로 변환하기 위해 Symfony HTTP Message Bridge 컴포넌트를 사용합니다:

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

이러한 라이브러리를 설치한 후, 라우트 클로저 또는 컨트롤러 메서드에서 요청 인터페이스에 타입 힌트를 지정하여 PSR-7 요청을 얻을 수 있습니다.

use Psr\Http\Message\ServerRequestInterface;
 
Route::get('/', function (ServerRequestInterface $request) {
// ...
});
lightbulb

라우트 또는 컨트롤러에서 PSR-7 응답 인스턴스를 반환하면 자동으로 Laravel 응답 인스턴스로 다시 변환되어 프레임워크에서 표시됩니다.

입력

입력 검색

모든 입력 데이터 검색

all 메서드를 사용하여 들어오는 요청의 모든 입력 데이터를 array로 검색할 수 있습니다. 이 메서드는 들어오는 요청이 HTML 폼에서 온 것인지 XHR 요청인지에 관계없이 사용할 수 있습니다.

$input = $request->all();

collect 메서드를 사용하여 들어오는 요청의 모든 입력 데이터를 컬렉션으로 검색할 수 있습니다.

$input = $request->collect();

collect 메서드를 사용하면 들어오는 요청 입력의 하위 집합을 컬렉션으로 검색할 수도 있습니다.

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

입력 값 검색

몇 가지 간단한 메서드를 사용하면 요청에 사용된 HTTP 동사에 대해 걱정할 필요 없이 Illuminate\Http\Request 인스턴스에서 모든 사용자 입력에 액세스할 수 있습니다. HTTP 동사에 관계없이 input 메서드를 사용하여 사용자 입력을 검색할 수 있습니다.

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

input 메서드에 두 번째 인수로 기본값을 전달할 수 있습니다. 요청된 입력 값이 요청에 없는 경우 이 값이 반환됩니다.

$name = $request->input('name', '샐리');

배열 입력을 포함하는 폼으로 작업할 때는 "점" 표기법을 사용하여 배열에 액세스합니다.

$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', '헬렌');

인수 없이 query 메서드를 호출하여 모든 쿼리 문자열 값을 연관 배열로 검색할 수 있습니다.

$query = $request->query();

JSON 입력 값 검색

애플리케이션에 JSON 요청을 보낼 때 요청의 Content-Type 헤더가 application/json으로 올바르게 설정되어 있는 한 input 메서드를 통해 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 요소를 다룰 때 애플리케이션은 실제로 문자열인 "truthy" 값을 받을 수 있습니다. 예를 들어 "true" 또는 "on"입니다. 편의를 위해 boolean 메서드를 사용하여 이러한 값을 부울로 검색할 수 있습니다. boolean 메서드는 1, "1", true, "true", "on" 및 "yes"에 대해 true를 반환합니다. 다른 모든 값은 false를 반환합니다.

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

날짜 입력 값 검색

편의를 위해 날짜/시간이 포함된 입력 값은 date 메서드를 사용하여 Carbon 인스턴스로 검색할 수 있습니다. 요청에 지정된 이름의 입력 값이 없으면 null이 반환됩니다.

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

date 메서드에서 허용하는 두 번째 및 세 번째 인수를 사용하여 날짜의 형식과 시간대를 각각 지정할 수 있습니다.

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

입력 값이 있지만 형식이 유효하지 않으면 InvalidArgumentException이 throw됩니다. 따라서 date 메서드를 호출하기 전에 입력을 유효성 검사하는 것이 좋습니다.

Enum 입력 값 검색

PHP 열거형에 해당하는 입력 값도 요청에서 검색할 수 있습니다. 요청에 지정된 이름의 입력 값이 없거나 열거형에 입력 값과 일치하는 지원 값이 없으면 null이 반환됩니다. enum 메서드는 입력 값의 이름과 열거형 클래스를 첫 번째 및 두 번째 인수로 허용합니다.

use App\Enums\Status;
 
$status = $request->enum('status', Status::class);

입력 값이 PHP 열거형에 해당하는 값의 배열인 경우 enums 메서드를 사용하여 값 배열을 열거형 인스턴스로 검색할 수 있습니다.

use App\Enums\Product;
 
$products = $request->enums('products', Product::class);

동적 속성을 통한 입력 검색

Illuminate\Http\Request 인스턴스에서 동적 속성을 사용하여 사용자 입력에 액세스할 수도 있습니다. 예를 들어 애플리케이션의 폼 중 하나에 name 필드가 있는 경우 다음과 같이 필드 값에 액세스할 수 있습니다.

$name = $request->name;

동적 속성을 사용할 때 Laravel은 먼저 요청 페이로드에서 매개 변수의 값을 찾습니다. 없는 경우 Laravel은 일치하는 라우트의 매개 변수에서 필드를 검색합니다.

입력 데이터의 일부 검색

입력 데이터의 하위 집합을 검색해야 하는 경우 onlyexcept 메서드를 사용할 수 있습니다. 이러한 메서드는 모두 단일 array 또는 동적 인수 목록을 허용합니다.

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

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" 값이 채워지지 않았습니다...
});

주어진 키가 요청에 없는지 확인하려면 missingwhenMissing 메서드를 사용할 수 있습니다.

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의 내장 유효성 검사 기능 중 일부가 자동으로 호출하므로 이러한 세션 입력 플래싱 메서드를 수동으로 직접 사용할 필요가 없을 수 있습니다.

세션에 입력 플래싱

Illuminate\Http\Request 클래스의 flash 메서드는 현재 입력을 세션에 플래시하여 사용자가 애플리케이션에 대한 다음 요청 중에 사용할 수 있도록 합니다.

$request->flash();

flashOnlyflashExcept 메서드를 사용하여 요청 데이터의 하위 집합을 세션에 플래시할 수도 있습니다. 이러한 메서드는 암호와 같은 민감한 정보를 세션에서 제외하는 데 유용합니다.

$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')
);

이전 입력 검색

이전 요청에서 플래시된 입력을 검색하려면 Illuminate\Http\Request 인스턴스에서 old 메서드를 호출합니다. old 메서드는 세션에서 이전에 플래시된 입력 데이터를 가져옵니다.

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

Laravel은 또한 전역 old 헬퍼를 제공합니다. Blade 템플릿 내에 이전 입력을 표시하는 경우 old 헬퍼를 사용하여 폼을 다시 채우는 것이 더 편리합니다. 주어진 필드에 대한 이전 입력이 없으면 null이 반환됩니다.

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

쿠키

요청에서 쿠키 검색

Laravel 프레임워크에서 생성한 모든 쿠키는 암호화되고 인증 코드로 서명되므로 클라이언트가 변경한 경우 유효하지 않은 것으로 간주됩니다. 요청에서 쿠키 값을 검색하려면 Illuminate\Http\Request 인스턴스에서 cookie 메서드를 사용합니다.

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

입력 트리밍 및 정규화

기본적으로 Laravel은 애플리케이션의 전역 미들웨어 스택에 Illuminate\Foundation\Http\Middleware\TrimStringsIlluminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull 미들웨어를 포함합니다. 이러한 미들웨어는 요청에서 들어오는 모든 문자열 필드를 자동으로 트리밍하고 빈 문자열 필드를 null로 변환합니다. 이렇게 하면 라우트 및 컨트롤러에서 이러한 정규화 문제에 대해 걱정할 필요가 없습니다.

입력 정규화 비활성화

모든 요청에 대해 이 동작을 비활성화하려면 애플리케이션의 bootstrap/app.php 파일에서 $middleware->remove 메서드를 호출하여 애플리케이션의 미들웨어 스택에서 두 미들웨어를 제거할 수 있습니다.

use Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull;
use Illuminate\Foundation\Http\Middleware\TrimStrings;
 
->withMiddleware(function (Middleware $middleware) {
$middleware->remove([
ConvertEmptyStringsToNull::class,
TrimStrings::class,
]);
})

애플리케이션에 대한 요청의 하위 집합에 대해 문자열 트리밍 및 빈 문자열 변환을 비활성화하려면 애플리케이션의 bootstrap/app.php 파일 내에서 trimStringsconvertEmptyStringsToNull 미들웨어 메서드를 사용할 수 있습니다. 두 메서드 모두 입력 정규화를 건너뛰어야 하는지 여부를 나타내는 true 또는 false를 반환해야 하는 클로저 배열을 허용합니다.

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

파일

업로드된 파일 검색

file 메서드 또는 동적 속성을 사용하여 Illuminate\Http\Request 인스턴스에서 업로드된 파일을 검색할 수 있습니다. file 메서드는 PHP SplFileInfo 클래스를 확장하고 파일과 상호 작용하기 위한 다양한 메서드를 제공하는 Illuminate\Http\UploadedFile 클래스의 인스턴스를 반환합니다.

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

hasFile 메서드를 사용하여 파일이 요청에 있는지 확인할 수 있습니다.

if ($request->hasFile('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');
lightbulb

Laravel의 파일 저장에 대한 자세한 내용은 전체 파일 저장 문서를 참조하십시오.

신뢰할 수 있는 프록시 구성

TLS/SSL 인증서를 종료하는 로드 밸런서 뒤에서 애플리케이션을 실행하는 경우 url 헬퍼를 사용할 때 애플리케이션이 때때로 HTTPS 링크를 생성하지 않는 것을 알 수 있습니다. 일반적으로 이는 애플리케이션이 로드 밸런서에서 포트 80에서 트래픽을 전달받고 안전한 링크를 생성해야 하는지 모르기 때문입니다.

이 문제를 해결하려면 Laravel 애플리케이션에 포함된 Illuminate\Http\Middleware\TrustProxies 미들웨어를 활성화할 수 있습니다. 이를 통해 애플리케이션에서 신뢰해야 하는 로드 밸런서 또는 프록시를 빠르게 사용자 지정할 수 있습니다. 신뢰할 수 있는 프록시는 애플리케이션의 bootstrap/app.php 파일에서 trustProxies 미들웨어 메서드를 사용하여 지정해야 합니다.

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

신뢰할 수 있는 프록시를 구성하는 것 외에도 신뢰해야 하는 프록시 헤더를 구성할 수도 있습니다.

->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
);
})
lightbulb

AWS Elastic Load Balancing을 사용하는 경우 headers 값은 Request::HEADER_X_FORWARDED_AWS_ELB여야 합니다. 로드 밸런서가 RFC 7239의 표준 Forwarded 헤더를 사용하는 경우 headers 값은 Request::HEADER_FORWARDED여야 합니다. headers 값에 사용할 수 있는 상수에 대한 자세한 내용은 프록시 신뢰에 대한 Symfony의 문서를 확인하십시오.

모든 프록시 신뢰

Amazon AWS 또는 다른 "클라우드" 로드 밸런서 제공업체를 사용하는 경우 실제 밸런서의 IP 주소를 모를 수 있습니다. 이 경우 *를 사용하여 모든 프록시를 신뢰할 수 있습니다.

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

신뢰할 수 있는 호스트 구성

기본적으로 Laravel은 HTTP 요청의 Host 헤더 내용에 관계없이 수신하는 모든 요청에 응답합니다. 또한 Host 헤더의 값은 웹 요청 중에 애플리케이션에 대한 절대 URL을 생성할 때 사용됩니다.

일반적으로 Nginx 또는 Apache와 같은 웹 서버를 구성하여 지정된 호스트 이름과 일치하는 요청만 애플리케이션으로 보내야 합니다. 그러나 웹 서버를 직접 사용자 지정할 수 없고 특정 호스트 이름에 대해서만 Laravel이 응답하도록 지시해야 하는 경우 애플리케이션에 대해 Illuminate\Http\Middleware\TrustHosts 미들웨어를 활성화하여 이 작업을 수행할 수 있습니다.

TrustHosts 미들웨어를 활성화하려면 애플리케이션의 bootstrap/app.php 파일에서 trustHosts 미들웨어 메서드를 호출해야 합니다. 이 메서드의 at 인수를 사용하여 애플리케이션이 응답해야 하는 호스트 이름을 지정할 수 있습니다. 다른 Host 헤더가 있는 들어오는 요청은 거부됩니다.

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

기본적으로 애플리케이션 URL의 하위 도메인에서 오는 요청도 자동으로 신뢰됩니다. 이 동작을 비활성화하려면 subdomains 인수를 사용할 수 있습니다.

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

신뢰할 수 있는 호스트를 확인하기 위해 애플리케이션의 구성 파일 또는 데이터베이스에 액세스해야 하는 경우 at 인수에 클로저를 제공할 수 있습니다.

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