رفع ارور 404 در لاراول + آموزش حل مشکل مرحله‌به‌مرحله

نیلوفر ماشینینیلوفر ماشینی
5 مرداد 1405
13 دقیقه مطالعه
رفع ارور 404 در لاراول

مهم‌ترین دلیل ارور ۴۰۴ در لاراول چیست و چطور آن را برطرف کنیم؟

اگر هنگام توسعه وب‌سایت با ارور ۴۰۴ در لاراول مواجه شده‌اید و نمی‌دانید علت آن چیست، باید بدانید این خطا زمانی نمایش داده می‌شود که سرور نتواند مسیر یا منبع درخواستی را پیدا کند. این مشکل معمولا به‌دلیل وارد کردن نادرست آدرس (URL)، تعریف نشدن "Route" یا برقراری نادرست ارتباط بین "Route" و "Controller" ایجاد می‌شود. در نتیجه کاربر به صفحه موردنظر دسترسی نخواهد داشت و این موضوع می‌تواند تجربه کاربری وب‌سایت را تحت تاثیر قرار دهد. در این مقاله از مجله سبزلرن ابتدا دلایل بروز ارور ۴۰۴ در لاراول را بررسی می‌کنیم و سپس روش‌های کاربردی و مرحله‌به‌مرحله رفع این خطا را آموزش می‌دهیم تا در صورت بروز این مشکل بتوانید به‌سرعت آن را برطرف کنید.

ارور ۴۰۴ در لاراول چیست؟

ارور ۴۰۴ در لاراول در واقع یک کد وضعیت "HTTP" به نام "Not Found" است! این خطا زمانی رخ می‌دهد که فریم‌ورک نتواند مسیر (Route)، کنترلر یا منبعی را که کاربر درخواست کرده پیدا کند؛ به‌عبارت دیگر وقتی یک درخواست به سرور ارسال می‌شود، لاراول ابتدا سعی می‌کند آن را با روت‌های تعریف‌شده (مثلا در فایل‌های "web.php" یا "api.php" تطبیق دهد و اگر هیچ روت یا فایل معتبری مطابق با آن "URL" وجود نداشته باشد، این خطا را برمی‌گرداند.

 این مشکل معمولا به دلایلی مثل اشتباه بودن URL، تعریف نشدن روت، استفاده از متد HTTP اشتباه مثل GET به‌جای POST، نبود فایل یا کنترلر مربوطه، کش شدن روت‌ها، یا حتی تنظیمات نادرست سرور (Apache/Nginx) رخ می‌دهد. رفع ارور ۴۰۴ در لاراول کار سختی نیست و فقط باید دلیل آن را پیدا کنید!

laravel-404-error-causes.webp

دلایل رایج ارور ۴۰۴ در لاراول

در فرآیند توسعه با فریم‌ورک Laravel، خطای ۴۰۴ معمولا به‌دلایل مختلفی در بخش روتینگ، کنترلرها یا تنظیمات سرور ایجاد می‌شود. این خطا همیشه به معنای نبود یک صفحه ساده نیست، بلکه می‌تواند نشانه‌ای از یک ناهماهنگی در ساختار پروژه باشد. در ادامه رایج‌ترین دلایل بروز این خطا را به‌صورت دقیق بررسی و سپس در مورد نحوه رفع ارور ۴۰۴ در لاراول بحث می‌کنیم:

تعریف نشدن Route (مسیر) در لاراول

یکی از پایه‌ای‌ترین دلایل بروز خطای ۴۰۴ این است که مسیر مورد نظر شما اصلا در سیستم روتینگ لاراول تعریف نشده است. لاراول تمام درخواست‌ها را ابتدا با لیست "Route"های تعریف‌شده در فایل‌های "web.php" یا "api.php" مقایسه می‌کند؛ اگر هیچ مسیری با URL واردشده مطابقت نداشته باشد، به‌صورت پیش‌فرض خطای ۴۰۴ نمایش داده می‌شود. این اتفاق معمولا زمانی رخ می‌دهد که توسعه‌دهنده فراموش کرده Route را تعریف کند یا آن را در فایل اشتباهی قرار داده است!

اشتباه در نوشتن URL

حتی اگر "Route" به‌درستی تعریف شده باشد، یک اشتباه ساده در URL می‌تواند باعث بروز خطای ۴۰۴ شود! این اشتباه‌ها در اغلب موارد شامل تایپ اشتباه، استفاده نادرست از حروف بزرگ و کوچک یا حتی وجود یا عدم وجود اسلش (/) در انتهای مسیر است. لاراول در تطبیق مسیرها دقیق عمل می‌کند و کوچک‌ترین اختلاف باعث عدم شناسایی Route می‌شود. این مورد به‌خصوص در پروژه‌های بزرگ یا URLهای طولانی بیشتر دیده می‌شود که باید از روش مناسب نحوه رفع ارور ۴۰۴ در لاراول برای برطرف کردن آن استفاده کنید.

عدم تطابق Route با متد HTTP (GET, POST, …)

در لاراول هر Route با یک متد HTTP مشخص (مثل "GET"، "POST"، "PUT" یا"DELETE") تعریف می‌شود. اگر شما Route را با متد GET تعریف کنید اما درخواست را با POST ارسال کنید (مثلا از طریق فرم یاPostman)، لاراول آن را به‌عنوان یک مسیر معتبر در نظر نمی‌گیرد و ممکن است خطای ۴۰۴ نمایش دهد. این موضوع در فرم‌ها و APIها بسیار رایج است و معمولا به اشتباه در تنظیم متد فرم یا درخواست برمی‌گردد.

وجود نداشتن Controller یا متد مربوطه

گاهی Route به‌درستی تعریف شده، اما کنترلر یا متدی که به آن اشاره می‌کند وجود ندارد یا نام آن اشتباه نوشته شده است. در این حالت لاراول نمی‌تواند درخواست را به‌درستی هندل کند. بسته به شرایط ممکن است خطاهای دیگری نیز نمایش داده شود، اما در برخی سناریوها (به‌خصوص در حالت"production") این مشکل به‌صورت خطای ۴۰۴ دیده می‌شود. این مورد معمولا ناشی از اشتباه در "namespace" نام کلاس یا متد است.

مشکل در تنظیمات .htaccess یا وب‌سرور

در سرورهایی مانند آپاچی (Apache)، فایل ".htaccess" نقش مهمی در هدایت تمام درخواست‌ها به فایل "index.php " لاراول دارد. اگر این فایل حذف شده باشد یا به‌درستی پیکربندی نشده باشد، درخواست‌ها اصلا وارد چرخه لاراول نمی‌شوند و سرور به‌صورت مستقیم خطای ۴۰۴ برمی‌گرداند. این مشکل معمولا هنگام دیپلوی پروژه یا انتقال به هاست جدید رخ می‌دهد.

کش شدن Route‌ها (Route Cache)

لاراول برای افزایش کارایی، امکان کش کردن Routeها را فراهم کرده است. اما اگر پس از اعمال تغییرات در مسیرها، کش پاک نشود یعنی لاراول همچنان از نسخه قدیمی Routeها استفاده می‌کند. در نتیجه حتی اگر Route جدید را به‌درستی تعریف کرده باشید، ممکن است با خطای ۴۰۴ مواجه شوید! برای رفع این مشکل باید کش Routeها را با دستور php artisan route:clear پاک کنید.

استفاده اشتباه از Prefix یا Group در Route‌ها

در پروژه‌های بزرگ معمولا Route ها در قالب گروه‌هایی با prefix مشخص (مثلا /admin یا /api) تعریف می‌شوند. اگر هنگام فراخوانی URL این prefix را در نظر نگیرید، مسیر مورد نظر پیدا نمی‌شود و خطای ۴۰۴ رخ می‌دهد. این موضوع زمانی بیشتر مشکل‌ساز می‌شود که چندین گروه Route با prefixهای مختلف در پروژه وجود داشته باشد.

fix-laravel-404-error.webp

روش‌های رفع ارور در لاراول

در فرآیند توسعه با فریم‌ورک Laravel، خطای ۴۰۴ معمولا به دلایل مختلفی در بخش روتینگ، کنترلرها یا تنظیمات سرور ایجاد می‌شود. این خطا همیشه به معنای نبود یک صفحه ساده نیست، بلکه می‌تواند نشانه‌ای از یک ناهماهنگی در ساختار پروژه باشد. در ادامه رایج‌ترین دلایل بروز این خطا را به‌صورت دقیق بررسی و سپس در مورد نحوه رفع ارور در لاراول بحث می‌کنیم:

۱. مطمئن شوید Route واقعا در routes/api.php تعریف شده است

یکی از رایج‌ترین اشتباهاتی که باعث ارور ۴۰۴ در لاراول می‌شود این است که Route مربوط به API اصلا تعریف نشده یا به اشتباه در web.php گذاشته شده است. اگر endpoint شما مثلا /users یا /orders است اما در لیست Route ها دیده نمی‌شود، لاراول احتمالا ۴۰۴ برمی‌گرداند. برای بررسی فوری این دستور را اجرا کنید:

php artisan route:list

اگر endpoint شما در خروجی نبود، اول باید تعریف Route را اصلاح کنید. مستندات رسمی هم تاکید می‌کنند که همه Routeها در فایل‌های routes تعریف می‌شوند و از همان‌جا توسط برنامه بارگذاری می‌شوند.

۲. پیشوند API را فراموش نکنید

در بسیاری از پروژه‌ها Routeهای API با پیشوند مخصوص API در دسترس هستند. در واقع توسعه‌دهنده Route را در api.php تعریف می‌کند اما هنگام تست در Postman یا مرورگر، آدرس را بدون پیشوند درست صدا می‌زند که نتیجه آن ارور ۴۰۴ در لاراول است. برای همین باید آدرس نهایی را با route:list چک کنید، نه با حدس! مستندات رسمی نیز میان Routeهای وب و API تفکیک قائل می‌شوند و API routing را از طریق routes/api.php توضیح می‌دهند.

۳. متد HTTP را دقیق بررسی کنید

در APIها این مورد از نسخه وب هم مهم‌تر است. ممکن است Route برای GET تعریف شده باشد اما شما در Postman با POST، PUT یا DELETE درخواست بفرستید. در این حالت endpoint از نظر شما “وجود دارد”، اما از نظر Route matcher لاراول درخواست منطبق نیست. با php artisan route:list ستون متد را نگاه کنید و همان متد را در کلاینت API بفرستید. مستندات Routing لاراول Routeها را دقیقا بر اساس مسیر و متد ثبت می‌کنند.

۴. پارامترهای Route را بررسی کنید

در APIها خیلی از مسیرها مانند نمونه زیر داینامیک‌ هستند:

Route::get('/users/{id}', [UserController::class, 'show']);

اگر /api/users را بدون {id} صدا بزنید یا الگوی پارامتر درست نباشد، Route match نمی‌شود و ارور ۴۰۴ در لاراول را می‌بینید. این مشکل وقتی شدیدتر می‌شود که روی Route محدودیت regex یا binding خاص گذاشته باشید!

۵. Route Model Binding یکی از مهم‌ترین دلایل ۴۰۴ در API است

در لاراول، اگر مدل را مستقیم در Route یا کنترلر type-hint کنید، فریم‌ورک به‌صورت خودکار رکورد متناظر را از دیتابیس پیدا می‌کند. اگر آن رکورد وجود نداشته باشد، نتیجه معمولا ۴۰۴ است، نه لزوماً یک exception قابل مشاهده برای کاربر نهایی. این رفتار در مستندات Routing با عنوان implicit model binding توضیح داده شده است. به‌طور مثال:

Route::get('/posts/{post}', function (App\Models\Post $post) {

return $post;

});

اگر post با آن شناسه یا slug در دیتابیس وجود نداشته باشد، لاراول پاسخ ۴۰۴ می‌دهد. پس وقتی endpoint ظاهرا درست است ولی فقط برای بعضی ID ها ۴۰۴ می‌گیرید، اول دیتابیس و binding را چک کنید.

۶. کنترلر و متد هدف را بررسی کنید

در APIها خیلی وقت‌ها مشکل از خود Route نیست، بلکه از این است که Route به کنترلر یا متدی وصل شده که جابه‌جا شده، rename شده یا namespace آن اشتباه است. از آن‌جا که Route ها معمولا به کلاس کنترلر وصل می‌شوند، باید import کلاس هم درست باشد:

use App\Http\Controllers\Api\UserController;

Route::get('/users', [UserController::class, 'index']);

اگر در route:list کنترلر دیده می‌شود اما اجرا به نتیجه نمی‌رسد، فایل و namespace کنترلر را بررسی کنید. اصل تعریف Route در فایل‌های routes و اتصال آن‌ها به کنترلر در مستندات رسمی توضیح داده شده است.

۷. کش Routeها را پاک کنید

بعد از تغییر endpoint ها، یکی از علت‌های کلاسیک ۴۰۴ این است که Route ها از cache قدیمی خوانده می‌شوند. لاراول ابزار رسمی برای ساخت و پاک‌کردن route cache دارد و مستندات API framework هم به ساخت route cache اشاره می‌کنند. وقتی مسیر تازه‌ای اضافه کرده‌اید اما هنوز ۴۰۴ می‌گیرید، این دستورات معمولاً اولین درمان عملی‌اند:

php artisan route:clear

php artisan optimize:clear

php artisan route:list

اگر بعد ازclear، Route در لیست ظاهر شد، مشکل از cache بوده است.

۸. فرق ۴۰۴ واقعی با ۴۰۴ ناشی از منطق برنامه را تشخیص دهید

در APIهای لاراول، همیشه ۴۰۴ به معنی Route تعریف نشده؛ بلکه گاهی endpoint وجود دارد اما داخل کنترلر یا سرویس از متدهایی مثل findOrFail()، firstOrFail() یا abort(404) استفاده شده و برنامه عمدا ۴۰۴ برگردانده است. در چنین حالتی نه فقط Routeها بلکه باید لاگ‌ها، کنترلر و لایه service را نیز بررسی کنید.

۹. لاگ‌ها را کنار route:list بررسی کنید

برای APIها ترکیب این سه کار معمولا سریع‌ترین مسیر عیب‌یابی است:

  • خروجی php artisan route:list

  • لاگ برنامه در storage/logs/laravel.log

  • تست دقیق endpoint در Postman یا curl با همان متد، همان URL و همان پارامترها

اگر Route در لیست هست اما فقط بعضی درخواست‌ها ۴۰۴ می‌شوند، احتمال Route Model Binding یا منطق داخلی بسیار بالاست.

laravel-api-404-error.webp

رفع ارور ۴۰۴ در API های لاراول

برای رفع ارور ۴۰۴ در APIهای لاراول ابتدا باید مطمئن شوید که درخواست شما به مسیر (Route) صحیح ارسال می‌شود و تمام اجزای آن، از جمله آدرس، متد HTTP و پارامترها، به‌درستی تنظیم شده‌اند. بررسی مرحله‌به‌مرحله موارد زیر به شما کمک می‌کند علت اصلی خطا را سریع‌تر پیدا و برطرف کنید:

  • تعریف Route در routes/api.php را بررسی کنید و با دستور php artisan route:list از ثبت شدن آن مطمئن شوید.

  • URL و پیشوند API (مانند /api یا /api/v1) را به‌دقت بررسی کنید.

  • متد HTTP درخواست (GET، POST، PUT، DELETE و...) را با تعریف Route مطابقت دهید.

  • پارامترهای Route را بررسی کنید و از ارسال صحیح آن‌ها مطمئن شوید.

  • Route Model Binding را بررسی کنید تا رکورد موردنظر در پایگاه داده وجود داشته باشد.

  • Controller و متد مربوطه را از نظر نام، مسیر و وجود آن‌ها بررسی کنید.

  • کش Route ها را با دستورهای php artisan route:clear و php artisan optimize:clear پاک کنید.

  • منطق داخل کنترلر را بررسی کنید تا از وجود دستوراتی مانند abort(404) یا findOrFail() مطلع شوید.

  • لاگ‌های لاراول در فایل storage/logs/laravel.log را بررسی کنید تا جزئیات بیشتری از علت خطا به دست آورید.

نکات حرفه‌ای برای جلوگیری از ارور ۴۰۴

بسیاری از خطاهای ۴۰۴ در لاراول با رعایت چند اصل ساده اما مهم قابل پیشگیری هستند. اگر از ابتدا ساختار استانداردی برای Routeها و APIها در نظر بگیرید و تغییرات را به‌درستی مدیریت کنید، احتمال بروز این خطا در محیط توسعه و Production به‌مراتب کمتر خواهد شد.

  • ساختار URL ثابتی برای APIها داشته باشید؛

    از پیشوندهایی مانند /api/v1 استفاده کنید تا مسیرها منظم و نسخه‌بندی آن‌ها ساده‌تر شود.

  • برای Route ها نام‌گذاری و تست خودکار انجام دهید؛

    این کار باعث می‌شود تغییرات مسیرها سریع‌تر شناسایی شوند و احتمال بروز ۴۰۴ کاهش پیدا کند.

  • بعد از هر تغییر، php artisan route:list را بررسی کنید؛

    با این دستور می‌توانید مسیرها، متدها، Prefixها و Controllerها را به‌سرعت بررسی کنید.

  • Route Model Binding را آگاهانه مدیریت کنید؛

    مشخص کنید شناسه‌ها بر اساس id یا slug هستند و بدانید که نبودن رکورد به‌صورت پیش‌فرض پاسخ ۴۰۴ ایجاد می‌کند.

  • کش Routeها را به‌درستی مدیریت کنید؛

    پس از تغییر مسیرها، کش را پاک کرده و دوباره بسازید تا Routeهای جدید بدون مشکل در دسترس باشند.

  • Endpointها را با Postman یا curl تست کنید؛

    همیشه URL، متد، هدرها و پارامترهای درخواست را به‌صورت واقعی بررسی کنید.

  • از Versioning برای API استفاده کنید؛

    نگه داشتن نسخه‌های مختلف API از شکستن کلاینت‌های قدیمی و ایجاد خطاهای ۴۰۴جلوگیری می‌کند.

  • مستندات API را به‌روز نگه دارید؛

    بسیاری از خطاهای ۴۰۴ به‌دلیل استفاده از Endpointهای قدیمی در مستندات رخ می‌دهند.

  • بین خطاهای ۴۰۴، ۴۰۱ و ۴۰۳ تفاوت قائل شوید؛

    استفاده صحیح از کدهای وضعیت HTTP، عیب‌یابی و نگهداری پروژه را ساده‌تر می‌کند.

در آخر باید بگوییم اگر می‌خواهید از ارور ۴۰۴ در لاراول جلوگیری کنید، فقط با تعریف صحیح Route ها کاری از پیش نمی‌رود و باید در طراحی استاندارد API، مدیریت کش، تست منظم و به‌روزرسانی مستندات نیز دقت لازم را به خرج دهید. همچنین اگر می‌خواهید این مفاهیم و سایر قابلیت‌های لاراول را به‌صورت عملی یاد بگیرید، دوره‌های آموزش لاراول در آکادمی سبزلرن انتخاب مناسبی برای یادگیری اصولی توسعه وب و ساخت APIهای حرفه‌ای هستند.

سوالات متداول

چرا بعد از ایجاد Route هنوز 404 می‌گیرم؟
احتمالا Route cache پاک نشده، URL یا متد HTTP اشتباه است، یا prefix (مثل /api) را در نظر نگرفته‌اید. همچنین ممکن است Route در فایل اشتباهی تعریف شده باشد.
چگونه بفهمم Route تعریف شده است؟
با دستور php artisan route:list می‌توانید همه مسیرها را ببینید. اگر Route در لیست نبود، یعنی اصلاً ثبت نشده یا cache مشکل دارد.
آیا مشکل می‌تواند از Controller باشد؟
بله، اگر کنترلر یا متد وجود نداشته باشد یا اشتباه نام‌گذاری شده باشد، درخواست به نتیجه نمی‌رسد و ممکن است به خطای 404 یا خطای دیگر ختم شود.
آیا URL در Blade باید دقیقا با Route یکی باشد؟
بله، URL باید کاملاً مطابق Route باشد؛ کوچک‌ترین تفاوت باعث 404 می‌شود. بهتر است از route() استفاده کنید تا خطای انسانی کمتر شود.
آیا فایل .htaccess روی Apache مهم است؟
بله، بسیار مهم است؛ این فایل درخواست‌ها را به index.php لاراول هدایت می‌کند. اگر تنظیم نباشد، حتی Routeهای درست هم 404 می‌شوند.
برای API لاراول هم همین راه‌ها کاربرد دارد؟
بله، همه این موارد برای API هم صدق می‌کند، با این تفاوت که باید متد HTTP، prefix /api و پارامترها را دقیق‌تر بررسی کنید.
آیا می‌توان یک صفحه 404 سفارشی ایجاد کرد؟
بله، می‌توانید فایل resources/views/errors/404.blade.php بسازید و ظاهر صفحه 404 را کاملا سفارشی طراحی کنید.

نظرات

برای ثبت نظر، لطفا وارد حساب کاربری خود شوید.
ورود یا عضویت
هنوز هیچ نظری ثبت نشده!

اولین نفری باش که برای این مقاله نظر میدی.