6 أساسيات Laravel 11: الطلبات

مقدمة
توفر فئة Illuminate\Http\Request
في Laravel طريقة موجهة للكائنات للتفاعل مع طلب HTTP الحالي الذي يتعامل معه تطبيقك واسترجاع المدخلات والكوكيز والملفات التي تم تقديمها مع الطلب.
التفاعل مع الطلب
الوصول إلى الطلب
للحصول على نسخة من طلب HTTP الحالي عبر حقن التبعية، يجب عليك تلميح نوع فئة Illuminate\Http\Request
في إغلاق المسار الخاص بك أو طريقة وحدة التحكم. سيتم حقن نسخة الطلب الواردة تلقائيًا بواسطة حاوية خدمة Laravel:
use Illuminate\Http\Request;
Route::get('/', function (Request $request) {
$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
عن طريق تعريف طريقة وحدة التحكم الخاصة بك على النحو التالي:
use Illuminate\Http\Request;
public function update(Request $request, $id)
{
$name = $request->input('name');
// تحديث المستخدم...
}
فحص مسار / مسار الطلب
تسمح لك طريقة 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']);
استرجاع مضيف الطلب
يمكنك استرجاع "المضيف" للطلب الوارد عبر طرق host
وhttpHost
وschemeAndHttpHost
:
$request->host();
$request->httpHost();
$request->schemeAndHttpHost();
استرجاع طريقة الطلب
سترجع طريقة 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
لاسترجاع رمز التوثيق من رأس Authorization
. إذا لم يكن هذا الرأس موجودًا، سيتم إرجاع سلسلة فارغة:
$token = $request->bearerToken();
عنوان IP للطلب
يمكن استخدام طريقة ip
لاسترجاع عنوان IP للعميل الذي قدم الطلب إلى تطبيقك:
$ipAddress = $request->ip();
إذا كنت ترغب في استرجاع مصفوفة من عناوين IP، بما في ذلك جميع عناوين IP العميل التي تم توجيهها بواسطة الوكلاء، يمكنك استخدام طريقة ips
. سيكون عنوان IP العميل "الأصلي" في نهاية المصفوفة:
$ipAddresses = $request->ips();
تفاوض المحتوى
يوفر 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، بما في ذلك الطلبات والاستجابات. إذا كنت ترغب في الحصول على نسخة من طلب PSR-7 بدلاً من طلب Laravel، ستحتاج أولاً إلى تثبيت بعض المكتبات. يستخدم Laravel مكون جسر رسائل HTTP من Symfony لتحويل طلبات واستجابات Laravel النموذجية إلى تنفيذات متوافقة مع PSR-7:
تثبيت المكتبات اللازمة:
composer require symfony/psr-http-message-bridge
composer require nyholm/psr7
بمجرد تثبيت هذه المكتبات، يمكنك الحصول على طلب PSR-7 عن طريق تلميح نوع ServerRequestInterface
في إغلاق المسار الخاص بك أو طريقة وحدة التحكم:
use Psr\Http\Message\ServerRequestInterface;
Route::get('/', function (ServerRequestInterface $request) {
// ...
});
إذا قمت بإرجاع نسخة استجابة PSR-7 من مسار أو وحدة تحكم، سيتم تحويلها تلقائيًا إلى نسخة استجابة Laravel وعرضها بواسطة الإطار.
المدخلات
استرجاع المدخلات
يمكنك استرجاع جميع بيانات المدخلات للطلب الوارد كمصفوفة باستخدام طريقة 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');
استرجاع قيم المدخلات ككائنات نصية
بدلاً من استرجاع بيانات المدخلات للطلب كقيمة نصية بدائية، يمكنك استخدام طريقة string
لاسترجاع بيانات الطلب كنسخة من Illuminate\Support\Stringable
:
$name = $request->string('name')->trim();
استرجاع قيم المدخلات كقيم بوليانية
عند التعامل مع عناصر HTML مثل مربعات الاختيار، قد يستقبل تطبيقك قيم "حقيقية" تكون في الواقع سلاسل نصية. على سبيل المثال، "true" أو "on". للراحة، يمكنك استخدام طريقة boolean
لاسترجاع هذه القيم كقيم بوليانية. تعيد طريقة boolean
true
للقيم 1، "1"، true
، "true"، "on"، و"yes". ستعيد جميع القيم الأخرى false
:
$archived = $request->boolean('archived');
استرجاع قيم المدخلات كقيم تاريخية
للراحة، يمكن استرجاع قيم المدخلات التي تحتوي على تواريخ/أوقات كنسخ من Carbon باستخدام طريقة date
. إذا لم يحتوي الطلب على قيمة مدخل بالاسم المعطى، سيتم إرجاع null
:
$birthday = $request->date('birthday');
يمكن استخدام الوسيطتين الثانية والثالثة اللتين تقبلهما طريقة date
لتحديد تنسيق التاريخ والمنطقة الزمنية، على التوالي:
$elapsed = $request->date('elapsed', '!H:i', 'Europe/Madrid');
إذا كانت قيمة المدخل موجودة ولكنها تحتوي على تنسيق غير صالح، سيتم إطلاق استثناء InvalidArgumentException
؛ لذلك، يوصى بالتحقق من صحة المدخل قبل استدعاء طريقة date
.
استرجاع قيم المدخلات عبر الخصائص الديناميكية
يمكنك أيضًا الوصول إلى مدخلات المستخدم باستخدام الخصائص الديناميكية على نسخة Illuminate\Http\Request
. على سبيل المثال، إذا كانت إحدى النماذج في تطبيقك تحتوي على حقل name
، يمكنك الوصول إلى قيمة الحقل كالتالي:
$name = $request->name;
عند استخدام الخصائص الديناميكية، سيبحث Laravel أولاً عن قيمة المعامل في حمولة الطلب. إذا لم تكن موجودة، سيبحث Laravel عن الحقل في المعاملات المتطابقة للمسار.
استرجاع جزء من بيانات المدخلات
إذا كنت بحاجة إلى استرجاع جزء من بيانات المدخلات، يمكنك استخدام طريقتي only
وexcept
. كلا الطريقتين تقبلان مصفوفة واحدة أو قائمة ديناميكية من الوسائط:
$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')) {
// ...
}
تُرجع طريقة 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]);
المدخلات القديمة
وميض المدخلات إلى الجلسة
ستومض طريقة 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') }}">
الكوكيز
استرجاع الكوكيز من الطلبات
جميع الكوكيز التي يتم إنشاؤها بواسطة إطار عمل Laravel مشفرة وموقعة برمز مصادقة، مما يعني أنه سيتم اعتبارها غير صالحة إذا تم تغييرها بواسطة العميل. لاستر
جع قيمة الكوكي من الطلب، استخدم طريقة 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) {
$middleware->remove([
ConvertEmptyStringsToNull::class,
TrimStrings::class,
]);
});
إذا كنت ترغب في تعطيل تقليم النصوص وتحويل السلاسل الفارغة إلى null
لمجموعة فرعية من الطلبات إلى تطبيقك، يمكنك استخدام طريقتي trimStrings
وconvertEmptyStringsToNull
داخل ملف bootstrap/app.php
لتطبيقك. تقبل كلتا الطريقتين مصفوفة من الإغلاقات، والتي يجب أن تعيد true
أو false
للإشارة إلى ما إذا كان يجب تخطي تطبيع المدخلات:
->withMiddleware(function (Middleware $middleware) {
$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')) {
// ...
}
التحقق من التحميل الناجح
بالإضافة إلى التحقق مما إذا كان الملف موجودًا، يمكنك التحقق من عدم وجود مشاكل أثناء تحميل الملف عبر طريقة isValid
:
if ($request->file('photo')->isValid()) {
// ...
}
مسارات الملفات والامتدادات
تحتوي فئة UploadedFile
أيضًا على طرق للوصول إلى المسار المؤهل بالكامل للملف وامتداده. ستقوم طريقة extension
بمحاولة تخمين امتداد الملف بناءً على محتوياته. قد يكون هذا الامتداد مختلفًا عن الامتداد الذي تم تقديمه بواسطة العميل:
$path = $request->photo->path();
$extension = $request->photo->extension();
طرق أخرى للملفات
توجد مجموعة متنوعة من الطرق الأخرى المتاحة على نسخ UploadedFile
. تحقق من وثائق API للفئة لمزيد من المعلومات حول هذه الطرق.
تخزين الملفات المحملة
لتخزين ملف محمل، ستستخدم عادةً إحدى أنظمة الملفات المكونة لديك. تحتوي فئة UploadedFile
على طريقة store
التي ستنقل ملفًا محملًا إلى أحد أقراصك، والذي قد يكون موقعًا على نظام الملفات المحلي الخاص بك أو موقع تخزين سحابي مثل Amazon S3. تقبل طريقة store
المسار الذي يجب تخزين الملف فيه بالنسبة إلى الدليل الجذري للنظام المكون. يجب ألا يحتوي هذا المسار على اسم ملف، حيث سيتم تلقائيًا إنشاء معرف فريد ليكون اسم الملف. تقبل طريقة store
أيضًا وسيطة اختيارية ثانية لاسم القرص الذي يجب استخدامه لتخزين الملف. ستعيد الطريقة مسار الملف بالنسبة إلى الجذر القرصي:
$path = $request->photo->store('images');
$path = $request->photo->store('images', 's3');
إذا كنت لا تريد أن يتم إنشاء اسم ملف تلقائيًا، يمكنك استخدام طريقة storeAs
، والتي تقبل المسار واسم الملف واسم القرص كوسائطها:
$path = $request->photo->storeAs('images', 'filename.jpeg');
$path = $request->photo->storeAs('images', 'filename.jpeg', 's3');
لمزيد من المعلومات حول تخزين الملفات في Laravel، تحقق من وثائق تخزين الملفات الكاملة.
تكوين الوكلاء الموثوقين
عند تشغيل تطبيقاتك خلف موازن تحميل يقوم بإنهاء شهادات TLS/SSL، قد تلاحظ أن تطبيقك لا يقوم أحيانًا بإنشاء روابط HTTPS عندما يستخدم مساعد url
. عادةً ما يكون ذلك لأن تطبيقك يستقبل حركة المرور من موازن التحميل على المنفذ 80 ولا يعرف أنه يجب إنشاء روابط آمنة. لحل هذه المشكلة، يمكنك تمكين Middleware Illuminate\Http\Middleware\TrustProxies
المضمنة في تطبيق Laravel الخاص بك، والتي تتيح لك تخصيص موازنات التحميل أو الوكلاء التي يجب الوثوق بها بسرعة من قبل تطبيقك. يجب تحديد الوكلاء الموثوقين باستخدام طريقة Middleware trustProxies
في ملف bootstrap/app.php
لتطبيقك:
->withMiddleware(function (Middleware $middleware) {
$middleware->trustProxies(at: [
'192.168.1.1',
'192.168.1.2',
]);
});
بالإضافة إلى تكوين الوكلاء الموثوقين، يمكنك أيضًا تكوين رؤوس الوكيل التي يجب الوثوق بها:
->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);
});
إذا كنت تستخدم 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) {
$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) {
$middleware->trustHosts(at: ['laravel.test']);
});
بشكل افتراضي، يتم الوثوق أيضًا بالطلبات القادمة من النطاقات الفرعية لعنوان URL للتطبيق تلقائيًا. إذا كنت ترغب في تعطيل هذا السلوك، يمكنك استخدام الوسيطة subdomains
:
->withMiddleware(function (Middleware $middleware) {
$middleware->trustHosts(at: ['laravel.test'], subdomains: false);
});
المراجع
لمزيد من المعلومات، راجع وثائق Laravel بواسطة فريق Laravel.
ناقش مشروعك معنا
نحن هنا للمساعدة في احتياجات تطوير الويب الخاصة بك. حدد موعدًا لمناقشة مشروعك وكيف يمكننا مساعدتك.
دعنا نجد أفضل الحلول لاحتياجاتك.