هنگامی که در اینترنت در حال گشت و گذار و مرور صفحات مختلف هستیم با هر آدرس URL ای که از طریق مرورگرمان از سرور سایت های مختلف درخواست می کنیم پرسش و پاسخ هایی در پس زمینه بین واسط کاربری ما (مرورگر) و سرور سایت مد نظر رد و بدل می شود که در اصطلاح به آنها کدهای وضعیت HTTP یا HTTP Status Codes می گویند.
این کدها ساز و کاری تعریف شده و قراردادی در بستر پروتکل HTTP (مخفف HyperText Transfer Protocol) هستند که توسط کنسرسیوم ها و بنیادهای جهانی استانداردسازی وب از جمله IETF (مخفف Internet Engineering Task Force) و W3C (مخفف World Wide Web Consortium) معرفی و سازمان دهی شده اند و امروزه تقریبا سرور یا مرورگری وجود ندارد که از این شیوه نامه پیروی نکند، کدهای وضعیت HTTP چه به لحاظ فنی و تخصصی و چه به لحاظ کاربردهای عمومی استفاده های فراوانی دارند و لذا آشنایی با جزئیات و مفهوم آنها می تواند به میزان زیادی به توسعه دانش و اطلاعات عمومی وبمان کمک کند.
کدهای وضعیت HTTP را چگونه بررسی کنیم؟
برای مشاهده و بررسی کدهای وضعیت HTTP می توانیم از قابلیت های مرورگرها برای توسعه دهندگان وب استفاده کنیم، معمولا در مرورگرهایی مانند فایرفاکس، گوگل کروم، اپرا و… قسمتی تحت عنوان ابزارهای توسعه دهندگان وب (Web Developers Tools) یا با عناوین مشابه وجود دارد که تمام فعل و انفعالات واسط کاربری (User Agent) و سرور را نمایش می دهد، برای دسترسی به این قسمت می توانیم از منوی مرورگر گزینه Web Console را انتخاب یا از دکمه F12 صفحه کلید استفاده کنیم، با دسترسی به قسمت Console اطلاعات کاملی از کدها و محتوایی که در هنگام درخواست (Request) و پاسخ (Response) بین مرورگر و سرور رد و بدل می شود قابل مشاهده خواهد بود.
برای برنامه نویسان PHP همه چیز از قبل مهیا شده است، کافی است برای بررسی پاسخ های وضعیت سرور نمونه دستور زیر را در کدها داشته باشیم:
//دریافت کد وضعیت
$http_status = http_response_code();
//تنظیم کد وضعیت
http_response_code(404);
نکته: درخواست و پاسخ سرور می تواند علاوه بر کد وضعیت شامل سربرگ های دیگر HTTP به طور مثال اطلاعات یک فرم، کوکی، اطلاعات مرورگر و… باشد، کد وضعیت حالت کلی پذیریش یا رد درخواست را مشخص می کند.
تفاوت نسخه های پروتکل HTTP
قبل از اینکه به بررسی کدهای وضعیت HTTP بپردازیم بد نیست اشاره ای داشته باشیم به نسخه های مختلف این پروتکل، اعدادی که در مقابل عبارت HTTP درج می شوند (۱/۰، ۱/۱ و ۲/۰) در واقع نسخه های مختلف این پروتکل هستند که توسط زیر مجموعه های IETF (کارگروه ویژه مهندسی اینترنت) توسعه یافته اند، هدف از معرفی پروتکل HTTP ایجاد استانداردی فراگیر برای نقل و انتقال اطلاعات در بستر شبکه جهانی وب بود و ۱/۰ نسخه ابتدایی و قدیمی این پروتکل است که در ابتدا مورد استفاده قرار می گرفت اما به دلیل نقایص و نقاط ضعفی که وجود داشت به تدریج توسعه داده شد و استاندارد HTTP 1/1 شکل گرفت، در بستر نسخه جدید پروتکل HTTP در هر ارسال درخواست و دریافت پاسخ بین واسط کاربری و سرور کدهای وضعیت بیشتری قابل تعریف است و امروزه بیشتر سرورها و مرورگرها از این چارچوب ها پیروی می کنند، در سالیان اخیر با همکاری شرکت گوگل نسخه ۲ پروتکل HTTP معرفی شد که در حال حاضر در وضعیت آزمایشی قرار دارد، در این نسخه بدون اینکه به کدهای وضعیت موجود خللی وارد شود امکانات جدیدی جهت استفاده برنامه های امروزی در دسترس قرار گرفته است.
کدهای سری ۱۰۰، مربوط به اطلاعات (Informational)
اولین سری از کدهای وضعیت HTTP با عدد ۱۰۰ شروع می شوند که در مورد نقل و انتقال بسته های اطلاعات به طور مثال ارسال و دریافت فایل ها کاربرد دارند و وضعیت سرور از نظر امکان پذیرش اطلاعات یا فرآیندهای مورد نیاز برای وجود این امکان را نشان می دهند، این سری از کدها صرفا در نسخه ۱/۱ HTTP در دسترس هستند و در نسخه ۱/۰ HTTP جز در حالت آزمایشی نباید مورد استفاده قرار گیرند.
کد ۱۰۰، ادامه ارسال (Continue)
کد ۱۰۰ HTTP برای مواقعی است که مروگر (واسط کاربری) می خواهد وضعیت سرور را به لحاظ امکان پذیرش داده های ارسالی بررسی کند، به فرض زمانی که از متد POST در فرم های وب استفاده می کنیم مرورگر قبل از ارسال قسمت اصلی اطلاعات یک درخواست در سربرگ های HTTP به سرور ارسال می کند (Expect: 100-continue)، دریافت پاسخ 100 Continue از سرور به این معنی است که سرور درخواست ارسال اطلاعات را پذیرفته و فرایند انتقال اطلاعات می تواند ادامه یابد، االبته بدون ارسال کد وضعیت ۱۰۰ نیز این فرایند ادامه می یابد لذا ارسال آن از طرف سرور اختیاری است و حتی در سرورها و مرورگرهایی که از نسخه HTTP/1.0 استفاده می کنند این کد قابل فهم و پردازش نیست، در این حالت معمولا این سربرگ توسط مرورگر ارسال نمی شود یا سرور در پاسخ ۴۱۷ Expectation Failed را برمی گرداند که به معنی لزوم تکرار درخواست مرورگر بدون سربرگ Expect: 100-continue است.
کد ۱۰۱، تعویض پروتکل ها (Switching Protocols)
کد وضعیت ۱۰۱ HTTP به معنی درخواست مرورگر (Client) از سرور جهت تعویض پروتکل نقل و انتقال داده است، در صورتی که سرور این تعویض پروتکل را مفید یا ضروری ارزیابی کند با ارسال کد ۱۰۱ Switching Protocols از درخواست مرورگر پیروی خواهد کرد، به فرض تعویض پروتکل HTTP 1/0 به نسخه HTTP 1/1 می تواند مفید باشد یا استفاده از پروتکل های Real-time و همزمان (Synchronous) نیز به همین صورت است، به طور مثال در برنامه هایی که از فناوری ای جکس (Ajax) یا WebSockets استفاده می کنند این کد وضعیت می تواند کاربرد داشته باشد.
کد ۱۰۲، در حال پردازش (Processing)
از آنجایی که درخواست های مرورگر از سرور ممکن است شامل انجام کارهای مختلفی باشد که هر کدام نیاز به پردازش جداگانه دارند، سرور با ارسال کد ۱۰۲ Processing به مرورگر می گوید که عملیات درخواستی دریافت شده و در حال پردازش است، به این صورت مرورگر در انتظار پاسخ کامل سرور بوده و از قطع ارتباط به دلیل به پایان رسیدن حداکثر زمان (Time-out) جلوگیری می شود.
کد ۱۰۳، پیش اشاره ها (Early Hints)
این کد وضعیت در حال حاضر به صورت آزمایشی معرفی شده و هدف از آن وجود امکان ارسال اطلاعات اولیه در سربرگ های HTTP به مرورگر قبل از اتمام ارسال کل پاسخ سرور است، ظاهرا این کد وضعیت برای ایجاد امکاناتی مانند پیش بارگذاری (Preloading) و مواردی از این دست کاربرد خواهد داشت.
کدهای سری ۲۰۰، درخواست موفق (Success)
کدهای سری ۲۰۰ به این معنی است که درخواست ارسالی واسط کاربری (که می تواند مرورگر یا برنامه دیگری باشد) با موفقیت دریافت، موافقت، پردازش و پاسخ داده شده است، کدهای سری ۲۰۰ معمولا به معنی بی نقص بودن درخواست و عملکرد صحیح سرور است.
کد ۲۰۰، پاسخ موفق (OK)
وضعیت عادی ارتباط تحت وب در پروتکل HTTP با عدد ۲۰۰ مشخص می شود، دریافت پاسخ ۲۰۰ OK از سرور به این معنی است که آدرس درخواستی (در متد GET) یا داده های مورد نظر (در متد POST) به طور کامل و موفقیت آمیز توسط سرور دریافت، پردازش و پاسخ درخواست داده شده است، در یک درخواست (Request) بدون نقص وب از سمت واسط کاربری (User-agent) به سرور کدهای سری ۲۰۰ باید در سربرگ های پاسخ (Response Headers) دریافت شوند.
کد ۲۰۱، ساخته شده (Created)
کد وضعیت HTTP 201 به معنی دریافت موفقیت آمیز درخواست و ساخته شدن یک منبع جدید در سرور است (به فرض ایجاد یک فایل یا صفحه جدید)، ارسال کد ۲۰۱ Created تنها در صورتی صحیح است که سرور منبع جدید را ساخته باشد در غیر اینصورت (اگر منبع هنوز ساخته نشده باشد) باید کد ۲۰۲ را ارسال کند، آدرس URI منبع جدید معمولا در پاسخ سرور به صورت سربرگ های HTTP در پارامتر Location گنجانده می شود.
کد ۲۰۲، موافقت شده (Accepted)
کد وضعیت ۲۰۲ HTTP به این معنی است که با درخواست واسط کاربری موافقت شده اما پردازش عملیات به طور کامل صورت نگرفته است، به همین دلیل تا پایان پردازش عملیات درخواستی ممکن است تقاضای کاربر کامل شده یا رد شود.
کد ۲۰۳، اطلاعات غیر معتبر (Non-Authoritative Information)
کد وضعیت ۲۰۳ HTTP که از نسخه HTTP 1/1 معرفی شده به این معنی است که سرور درخواست واسط کاربری را به طور موفقیت آمیز پاسخ داده اما اطلاعات ارسالی (در پاسخ سرور) از یک منبع دیگر است (به فرض کپی از اطلاعاتی است که درستی آن تایید نمی شود یا سرور نقش یک پراکسی را ایفا می کند)، تنظیم کد ۲۰۳ Non-Authoritative Information در سرورها اختیاری است و می توان به جای آن کد ۲۰۰ را ارسال کرد.
کد ۲۰۴، پاسخ بدون محتوا (No Content)
کد وضعیت ۲۰۴ HTTP به معنی دریافت و پردازش صحیح درخواست واسط کاربری است اما پاسخ سرور شامل محتوای خاصی نیست و می تواند به فرض تنها در برگیرنده تاریخ به روز رسانی منبع درخواستی باشد، معمولا دریافت کد ۲۰۴ No Content از سرور بدین معنی است که منبع درخواستی هیچ گونه تغییری از آخرین درخواست قبلی تا لحظه کنونی نداشته و فایل یا صفحه مربوطه به همان صورت قبلی در دسترس است، دریافت این کد در سمت کاربر (Client) می تواند از بارگذاری مجدد و بی مورد فایل ها جلوگیری کرده و سرعت بارگذاری و انجام فرآیندها را افزایش دهد.
نکته: برخی از سرورها ممکن است به جای کد ۲۰۴ کد ۲۰۰ به همراه سربرگ Content-Length با مقدار ۰ برگردانند که در عمل هر دو به یک معنی هستند:
HTTP/1.1 200 OK
Content-Length: 0
HTTP/1.1 204 No Content
استفاده از کد ۲۰۴ نسبت به حالت اول ساده تر و شیوه متداول است.
کد ۲۰۵، بازنشانی محتوا (Reset Content)
کد وضعیت ۲۰۵ HTTP شباهت زیادی به عملکرد کد ۲۰۴ دارد، در اینجا نیز فرآیندها در سرور موفقیت آمیز است و به طور مثال اطلاعات فرم از سمت کاربر دریافت و ذخیره شده است اما در پاسخ به جزء کد ۲۰۵ در سربرگ های HTTP هیچ محتوای دیگری توسط سرور ارسال نمی شود، با دریافت این کد در سمت کاربر مرورگر می تواند محتوای فعلی موجود در فرم را بازنشانی یا به عبارتی Reset کند، عملکرد این کد وضعیت HTTP مشابه حالتی است که دکمه ریست در فرم HTML در نظر گرفته باشیم.
کد ۲۰۶، قسمتی از محتوا (Partial Content)
کد وضعیت ۲۰۶ HTTP برای دریافت محدوده (Range) خاصی از محتوا به طور مثال برای حالت هایی که به فرض از امکاناتی نظیر ادامه دانلود (Download Resume) استفاده می کنیم کاربرد دارد، با درخواست یک محدوده از محتوا در سربرگ Range از سرور به درخواست واسط کاربری به صورت جزئی (Partial) پاسخ داده می شود، با این شیوه برنامه هایی که از نقل و انتقال چند قسمتی داده پشتیبانی می کنند قادر خواهند بود حتی پس از قطع ارتباط نیز به ادامه دریافت اطلاعات بپردازند، البته این قابلیت باید توسط سرور نیز پشتیبانی شود.
نمونه سربرگی که توسط مرورگر درخواست می شود:
GET /file.mkv HTTP/1.1
Range: bytes=3058590-5137179
نمونه سربرگی که از سرور در پاسخ دریافت می شود:
HTTP/1.1 206 Partial Content
Content-Range: bytes 3058590-5137179/8195769
Content-Type: video/x-matroska
در صورتی که سرور از این قابلیت پشتیبانی نکند به جای کد ۲۰۶ کد ۲۰۰ را در پاسخ ارسال می کند.
کدهای سری ۳۰۰، انتقال (Redirection)
کدهای سری ۳۰۰ مربوط به مواردی هستند که پاسخ به درخواست واسط کاربری از سمت سرور باید با انجام اعمال دیگری در سمت کاربر کامل شود، این عملیات معمولا توسط واسط کاربری (به طور مثال مرورگر) و بدون دخالت کاربر (به صورت خودکار) انجام می شود، به فرض ریدایرکت (Redirect) یا انتقال خودکار از یک آدرس URL به آدرسی دیگر با ارسال کدهای سری ۳۰۰ انجام می شود، نکته مهم در اینجا این مسئله است که تعداد ریدایرکت ها نباید در یک درخواست بیش از چند بار تکرار شوند، در غیر اینصورت در اکثر مرورگرها تا میزان تکرار خاصی فرض بر حلقه (Loop) بی انتها شده و ارتباط قطع خواهد شد.
کد ۳۰۰، انتخاب چندگانه (Multiple Choices)
کد وضعیت ۳۰۰ HTTP برای مواقعی است که سرور در پاسخ به درخواست واسط کاربری چند منبع مختلف را در سربرگ Link پیشنهاد می دهد (به طور مثال یک فایل با فرمت های مختلف) و انتخاب Link اصلی را بر عهده مرورگر می گذارد، عمل انتخاب نیز معمولا به صورت خودکار انجام می شود یا اینکه سرور یکی از URL ها را به عنوان پیش فرض در سربرگ Location برگزیده و همراه پاسخ خود ارسال می کند.
کد ۳۰۱، انتقال همیشگی (Moved Permanently)
کد وضعیت ۳۰۱ HTTP یکی از مهم ترین و پرکاربردترین کدهای HTTP مخصوصا در علم SEO (سئو، بهینه سازی برای موتورهای جستجو) است، دریافت این کد از طرف سرور به معنی انتقال همیشگی منبع درخواستی به آدرس دیگری است، می توانیم از این کد وضعیت مخصوصا هنگامی که در آدرس لینک های سایت به هر دلیل تغییرات ثابت ایجاد می کنیم جهت هدایت ربات های خزنده موتورهای جستجو یا کاربران به آدرس اصلی به صورت دائمی و بدون از دست دادن ارزش و رتبه آدرس ها استفاده کنیم، نمونه پاسخ سرور با کد ۳۰۱ می تواند به شکل زیر باشد:
HTTP/1.1 301 Moved Permanently
Location: http://example.com/new/url
در کنار کد ۳۰۱ سربرگ Location حاوی آدرس URL جدید نیز ارسال می شود.
نکته: در اعمال این کد وضعیت باید دقت کافی داشته و قبلا تمام جنبه ها را تست و بررسی کرده باشیم، کد ۳۰۱ در حافظه موقت (Cache) مرورگر ذخیره شده و ممکن است تغییر یا حذف آن از دسترس ما خارج باشد (در صورت نیاز صرفا کاربران می توانند حافظه موقت مرورگرشان را پاک کنند).
کد ۳۰۲، پیدا شد (Found)
کد وضعیت ۳۰۲ HTTP به این معنی است که منبع درخواستی یافت شده اما مرورگر باید موقتا به آدرس دیگری هدایت شود (Moved Temporarily)، این حالت با کد ۳۰۱ متفاوت است، در اینجا انتقال به صورت موقت انجام شده و آدرس اصلی همچنان معتبر و در دسترس خواهد بود، اما در ریدایرکت ۳۰۱ منظور انتقال همیشگی، حذف آدرس فعلی و جایگزینی آن با آدرس جدید است.
کد ۳۰۳، دیدن منبعی دیگر (See Other)
کد وضعیت ۳۰۳ HTTP نیز مشابه کد ۳۰۲ عمل می کند و انتقال موقت است، تفاوت در اینجا تاکید روی متد GET است، در کد ۳۰۳ آدرس فعلی و آدرسی که کاربر به آن منتقل می شود باید از طریق متد GET درخواست شوند که در حالت معمول نیز به اینصورت خواهد بود.
کد ۳۰۴، بدون تغییر (Not Modified)
کدوضعیت ۳۰۴ HTTP مربوط به مواقعی است که مرورگر همراه درخواست اصلی خود تقاضای اطلاعات مربوط به آخرین تغییرات فایل یا منبع را نیز از سرور دارد، اگر در فایل مورد نظر از تاریخ آخرین درخواست تا لحظه فعلی تغییری صورت نگرفته باشد (با هر تغییر در فایل های سرور، تاریخ آخرین تغییر در قسمت اطلاعات فایل ذخیره می شود)، سرور در پاسخ کد ۳۰۴ Not Modified را ارسال می کند، این کار علاوه بر اینکه باعث صرفه جویی در منابع سرور می شود در افزایش سرعت پردازش در سمت کاربر نیز نقش بسیار موثری دارد و مرورگر مجبور نیست منابعی مانند فایل های JS، CSS، تصاویر و… را مجددا دانلود کند (فایل ها از حافظه موقت سیستم یا همان Cache مرورگر کاربر بارگذاری می شوند).
کد 305، استفاده از پراکسی (Use Proxy)
کد وضعیت ۳۰۵ HTTP به این معنی است که سرور برای دسترسی به منبع درخواستی باید از یک پراکسی (Proxy) استفاده کند، پراکسی در واقع سرور میانجی بین واسط کاربری و سرور اصلی سایت است، البته به دلایل حفظ امنیت پیمایش وب کاربران برخی مرورگرها مانند فایرفاکس و اینترنت اکسپلورر از این قابلیت پشتیبانی نمی کنند، نمونه سربرگ های پاسخ سرور:
HTTP/1.1 305 Use Proxy
Location: http://proxy.example.com:8080
این کد وضعیت در حال حاضر منسوخ (Deprecated) شده است.
کد ۳۰۶، تعویض پراکسی (Switch Proxy)
کد وضعیت ۳۰۶ HTTP هم مشابه کد ۳۰۵ است و مربوط به درخواست تغییر پراکسی، این کدها در حال حاضر منسوخ شده و کاربردی ندارند.
کد ۳۰۷، انتقال موقت (Temporary Redirect)
کد وضعیت ۳۰۷ HTTP مربوط به مواقعی است که منبع URL اصلی موقتا در آدرس دیگری قابل دسترسی است، این حالت با ریدایرکت ۳۰۲ و ۳۰۳ فرق دارد، در اینجا انتقال نیاز به تایید کاربر داشته و به صورت خودکار انجام نمی شود، متدهای استفاده شده (GET، POST و…) نیز باید بین URL اصلی و آدرس انتقالی مشترک باشد، بقیه شرایط مشابه کدهای ۳۰۲ و ۳۰۳ است و واسط کاربری باید لینک فعلی را همچنان و در مراجعات بعدی به عنوان آدرس اصلی مد نظر قرار دهد.
کد ۳۰۸، انتقال دائمی (Permanent Redirect)
کد وضعیت HTTP 308 نیز مشابه ریدایرکت ۳۰۱ است و انتقال آدرس در هر دو حالت همیشگی (Permanent) است، با این تفاوت که در انتقال با کد ۳۰۱ الزامی به حفظ متد استفاده شده بین دو آدرس قدیمی و جدید نیست اما در کد وضعیت ۳۰۸ واسط کاربری ملزم است از همان متدی که برای آدرس قدیمی استفاده کرده است برای آدرس جدید نیز استفاده کند، به طور مثال در کد ۳۰۸ است نباید متد از POST به GET تغییر کند.
کدهای سری ۴۰۰، خطای سمت کاربر (Client Error)
کدهای سری ۴۰۰ مربوط به رویداد خطایی از جانب واسط کاربری (سمت کاربر یا Client) در ارائه درخواست به سرور است، به طور مثال ممکن است آدرس URL به صورت ناقص ارسال شده باشد، در پاسخ سرور معمولا و به طور پیش فرض به همراه سربرگ های HTTP عباراتی در توضیح خطای رخ داده ارسال می کند و دائمی یا موقتی بودن مشکل به وجود آمده را نیز تعیین خواهد کرد.
کد ۴۰۰، درخواست نادرست (Bad Request)
کد وضعیت ۴۰۰ HTTP به دلیل درک نشدن شیوه نگارش (Syntax) درخواست واسط کاربری از سرور رخ می دهد، در این حالت مفهوم تقاضای کاربر برای سرور روشن نیست و درخواست قابل پردازش نمی باشد، این خطا ممکن است به دلایل دیگر از جمله نقص در انتقال داده ها (به فرض به دلیل قطع یا افت سرعت ارتباط) نیز رخ دهد.
کد ۴۰۱، دسترسی نامعتبر (Unauthorized)
کد وضعیت ۴۰۱ HTTP به معنی دسترسی غیر مجاز است، در این حالت منبع درخواستی به طور کامل محدود نشده است و درخواست کاربر نیاز به تایید مجوزهای دسترسی (به طور معمول نام کاربری و کلمه عبور) دارد، به همین دلیل سرور در پاسخ خود سربرگ از نوع WWW-Authenticate را ارسال کرده و از کاربر می خواهد تا اعتبار خود را معمولا با درج نام کاربری و کلمه عبور در فرم اثبات کند.
کد ۴۰۲، نیاز به پرداخت (Payment Required)
کد وضعیت ۴۰۲ HTTP در حال حاضر استفاده جاری ندارد و برای مقاصدی در آینده معرفی شده است، هدف از تعریف آن مربوط به حساب های کاربری است که نیاز به پرداخت وجه دارند، البته در عمل تا کنون چنین اتفاقی رخ نداده است و از کد ۴۰۲ استفاده چندانی نمی شود.
کد ۴۰۳، دسترسی غیر مجاز (Forbidden)
کد وضعیت ۴۰۳ HTTP مربوط به مواقعی است که کاربر درخواست منبعی را از سرور دارد که دسترسی به آن برای همه کاربران محدود شده است، این حالت با کد ۴۰۱ متفاوت است، در اینجا حتی با ورود نام کاربری و کلمه عبور نیز امکان دسترسی مقدور نخواهد بود، معمولا مدیران سایت ها دسترسی مستقیم به فولدرها و نمایش فایل ها به صورت لیست را غیر فعال می کنند، در نتیجه وقتی آدرس یک فولدر فیزیکی (فولدری که واقعا در زیرمجموعه دایرکتوری public_html یا www وجود دارد و نمایشی نیست) را از آن سرور درخواست کنیم احتمالا با خطای ۴۰۳ مواجه خواهیم شد، نمونه پاسخ سرور:
HTTP/1.1 403 Forbidden
Content-Type: text/html
Content-Length: 69
<h1>403: you don't have permission to access '/folder-name/' on this server!</h1>
متن همراه پاسخ در صفحه مرورگر نمایش داده می شود.
کد ۴۰۴، منبع درخواستی پیدا نشد (Not Found)
کد وضعیت ۴۰۴ HTTP در مواقعی کاربرد دارد که واسط کاربری تقاضای منبعی (به طور مثال یک فایل یا صفحه) را از سرور دارد که در حال حاضر موجود نبوده یا حذف شده است و یا ممکن است نام آن تغییر کرده باشد اما احتمال دارد در آینده مجددا آن منبع ایجاد شده و یا با نام قبلی در دسترس قرار گیرد، کد وضعیت ۴۰۴ را معمولا با نام خطای ۴۰۴ یا Not Found می شناسند، اغلب موتورهای جستجو در مواجه با این کد خطا در فواصل زمانی مشخص مجدد منبع مورد نظر را درخواست می کنند و اگر تا تعداد مشخصی همچنان پاسخ ۴۰۴ دریافت کنند نهایتا منصرف خواهند شد، لذا در صورتی که بخواهیم ارزش لینک های سایت که ممکن است به اشتباه دچار این اشکال شده اند حفظ شود باید در مدت زمان کوتاهی مشکل این گونه خطاهای ناخواسته را برطرف کنیم.
کد ۴۰۵، متد غیر مجاز (Method Not Allowed)
کد وضعیت ۴۰۵ HTTP به این معنی است که متد استفاده شده توسط کاربر برای درخواست یک منبع از سرور مجاز نمی باشد، به فرض استفاده از متد GET در حالتی که منبع درخواستی نیاز به ارسال منابعی از طریق متد POST دارد، یا استفاده از متد PUT در نوشتن یک فایل برای فایل هایی که فقط حالت خواندنی (Read-only) دارند، در این موارد معمولا سرور در پاسخ متد مجاز را نیز ارسال خواهد کرد.
کد ۴۰۶، غیر قابل قبول (Not Acceptable)
کد وضعیت ۴۰۶ HTTP ممکن است به دلیل وجود کاراکترهای غیر استاندارد در درخواست ارسالی رخ دهد، برخی از سرورها به دلایل امنیتی نیز ممکن است این کد را در پاسخ ارسال کنند، به طور مثال ماژول mod_security در سرورهای Apache از پذیرفتن برخی آدرس های وب (که از نظر امنیت، سرور آنها را مشکوک تشخیص دهد) خودداری کرده و پیام Not Acceptable دریافت خواهیم کرد.
کد ۴۰۷، نیاز به مجوز پراکسی (Proxy Authentication Required)
عملکرد کد وضعیت ۴۰۷ HTTP نیز شبیه کد ۴۰۱ است، با این تفاوت که در اینجا ابتدا کاربر (واسط کاربری) باید از طریق یک پراکسی اعتبار خود را اثبات کند.
کد ۴۰۸، پایان حداکثر زمان درخواست (Request Timeout)
کد وضعیت ۴۰۸ HTTP زمانی رخ می دهد که سرور در انتظار تکمیل درخواست واسط کاربری است اما هیچ پاسخی در زمان استاندارد دریافت نمی شود، به این صورت سرور کد ۴۰۸ را ارسال و ارتباط را قطع می کند و واسط کاربری می تواند مجددا و در دفعات بعدی درخواست خود را ارسال کند.
کد ۴۰۹، تعارض (Conflict)
کد وضعیت ۴۰۹ HTTP به معنی تداخل یا تعارض درخواست کاربر با عملیاتی دیگر در سرور مربوط به منبع مورد نظر است، در این حالت معمولا تکمیل درخواست نیازمند انجام فرآیندی در سرور است، به طور مثال وقتی می خواهیم فایلی را در یک دایرکتوری که در حال حاضر وجود ندارد آپلود کنیم برنامه سرور ممکن است این کد خطا را در پاسخ بازگشت دهد و واسط کاربری لحظاتی بعد و پس از ایجاد دایرکتوری مجدد درخواست را ارسال نماید، کد وضعیت ۴۰۹ می تواند برای API ها کاربردی باشد.
کد ۴۱۰، محذوف (Gone)
کد وضعیت ۴۱۰ HTTP به معنی حذف همیشگی منبع درخواستی از سرور است، بر خلاف خطای ۴۰۴ کد ۴۱۰ به واسط کاربری یا موتورهای جستجو می گوید که نباید مجددا آن منبع را درخواست کنند چون برای همیشه حذف شده و به عبارتی لینک مُرده است، البته در عمل موارد استفاده از این کد خیلی محدود است و تنظیم خطای ۴۰۴ از نظر بهینه سازی بهتر و اصولی تر است.
کد ۴۱۱، عدم ارسال طول درخواست (Length Required)
کد وضعیت ۴۱۱ HTTP به این معنی است که طول محتوای ارسالی از سمت کاربر تعیین نشده و به همین دلیل سرور از پاسخ به درخواست واسط کاربری خودداری می کند، معمولا هر درخواست مرورگر شامل محتوایی در قسمت اصلی یا Request Body است که اندازه این قسمت باید در سربرگ Content-Length ارسال شود.
کد ۴۱۲، پیش شرط رد شده (Precondition Failed)
کد وضعیت ۴۱۲ HTTP به این معنی است که درخواست واسط کاربری به همراه پیش شرطی بوده که توسط سرور رد شده است و بررسی های اولیه سرور نتیجه نادرست (False) دارد، به طور مثال ممکن است این شرط برای سرور تعیین شده باشد که کاربر صرفا در شرایطی مجاز باشد محتوا را به روزرسانی کند که از تاریخ آخرین ویرایش او کاربر دیگری آن محتوا را ویرایش نکرده باشد، در صورت عدم برقراری این شرط سرور می تواند خطای ۴۱۲ یا پیش شرط رد شده (Precondition Failed) را برگرداند.
نکته: تعیین شرط توسط یکی از سربرگ های If-Match، If-None-Match، If-Modified-Since و If-Unmodified-Since انجام می شود.
کد ۴۱۳، درخواست خیلی طولانی (Request Entity Too Large)
کد وضعیت ۴۱۳ HTTP در حالتی رخ می دهد که درخواست ارسالی شامل محتوایی است که اندازه آن بیش از انتظار سرور است و اغلب ارتباط توسط سرور قطع خواهد شد، اگر این حالت موقتی باشد در پاسخ سربرگ Retry-After نیز ارسال می شود و واسط کاربری مجددا و در دفعات بعدی می تواند درخواست خود را ارسال کند، موارد کاربرد این کد خطا می تواند به طور مثال زمانی باشد که کاربر فایلی را جهت آپلود ارسال می کند که حجم آن از حداکثر حجم مجاز بیشتر است یا زمانی که فرآیندهای دارای اولویت (Preemptive) در یک API به طور غیرقابل تصوری بیش از توان هسته پردازشگر برنامه است.
نکته: خطای ۴۱۳ را با عنوان Payload Too Large نیز می نامند.
کد ۴۱۴، آدرس وب خیلی طولانی (Request-URI Too Long)
کد وضعیت HTTP 414 به معنی بیش از حد طولانی بودن آدرس وب (URI) درخواستی است و سرور قادر به پردازش آن نیست، هرچند مرورگرها و موتورهای جستجو به صورت خودکار اندازه استانداردی را برای میزان طول مجاز آدرس URL اعمال می کنند با این حال بررسی مجدد آن در سرور در مواردی مانند جلوگیری از حملات DDoS (مخفف Distributed Denial-of-Service attacks) و یا بروز خطاهای ناخواسته (Bug) در برنامه می تواند مفید باشد.
کد ۴۱۵، فرمت پشتیبانی نشده (Unsupported Media Type)
کد وضعیت ۴۱۵ HTTP به دلیل ارسال محتوایی به همراه درخواست ارسالی (به فرض آپلود فایل یا تصویر) است که از نظر سرور قابل پذیرش نیست یا سرور فرمت آن را پشتیبانی نمی کند، به عبارتی در مواردی که محتوای ارسال شده از نظر سرور نامفهوم باشد می توانیم کد خطای ۴۱۵ را تنظیم کنیم، این موارد معمولا زمانی اتفاق می افتد که با وجود ارسال محتوا سربرگ Content-Type در درخواست واسط کاربری در نظر گرفته نشده باشد.
کد ۴۱۶، حد درخواستی غیر اقناع کننده (Requested Range Not Satisfiable)
کد وضعیت HTTP 416 به دلیل ارسال درخواست قسمتی از یک منبع (به فرض بخشی از یک فایل) از سرور در حالتی است که آن قسمت وجود ندارد، به طور مثال واسط کاربری در هنگام ادامه دانلود قسمتی از یک فایل را درخواست می کند که از حداکثر طول کل قسمت های آن بیشتر است، از نظر کاربردی این کد وضعیت نقطه مقابل ۲۰۶ Partial Content است که قبلا بررسی کردیم، سرورهایی که از قابلیت دانلود چندبخشی پشتیبانی نمی کنند معمولا به جای کد ۲۰۶ یا ۴۱۶ کد وضعیت ۲۰۰ برمی گردانند.
کد ۴۱۷، انتظارات رد شده (Expectation Failed)
کد وضعیت ۴۱۷ HTTP به این معنی است که سربرگ های HTTP ارسالی واسط کاربری با انتظارات و قابلیت های پشتیبانی شده سرور همخوانی ندارد یا سربرگی ارسال نشده است، معمولا واسط کاربری در مواقعی که احتمال دریافت خطای ۴۱۷ وجود دارد (به فرض در هنگام ارسال فایل های حجیم) ابتدا در سربرگ های HTTP مقادیر Expect: 100-continue را به همراه نوع و حجم فایل ارسال می کند، اگر پاسخ سرور هم ۱۰۰ Continue بود فایل اصلی ارسال می شود اما اگر پاسخ سرور ۴۱۷ Expectation Failed بود یعنی سرور به هر دلیل ادامه فرآیند را پذیرش نمی کند.
کد ۴۲۱، درخواست اشتباه هدایت شده (Misdirected Request)
کد وضعیت HTTP 421 به معنی درخواست هایی است که به اشتباه به سرور ارجاع داده می شود، این کد وضعیت در نسخه ۲/۰ معرفی شده اما ممکن است در سرورهای ۱/۱ نیز فعال باشد، بر این اساس اگر سرور تشخیص دهد که درخواست کاربر به اشتباه ارسال شده است به طور مثال یک ساب دامین درخواست شود که برای سرور تعریف شده نباشد در پاسخ با تنظیم کد ۴۲۱ واسط کاربری را جهت تغییر سرور راهنمایی می کند.
نمونه درخواست کاربر:
GET /page.html HTTP/1.1
Host: sub.example.com
نمونه پاسخ سرور:
HTTP/1.1 421 Misdirected Request
Content-Type: text/html
<h1>The client needs a new connection for this request as the requested host name does not match the Server Name!</h1>
نکته: از نسخه ۱/۱ واسط کاربری ملزم است سربرگ Host را ارسال کند.
کد ۴۲۵، خیلی زود (Too Early)
کد وضعیت HTTP 425 مربوط به ارتباط امن در بستر پروتکل HTTPS است، از نظر فنی برای برقراری ارتباط امن بین واسط کاربری و سرور نیاز به استفاده از TLS (مخفف Transport Layer Security) است که در واقع همان نسخه جدید SSL (مخفف Secure Sockets Layer) است که یک کانال امن برای رد و بدل کردن داده ها به صورت رمزنگاری شده محسوب می شود، فرآیند آماده سازی برای اتصال امن با به اصطلاح دست دادن (Handshake) بین واسط کاربری و سرور شروع می شود، اگر قبل از تکمیل این فرآیند محتوایی از جانب مرورگر ارسال شود احتمالا خطای ۴۲۵ از طرف سرور برگردانده می شود که یعنی برای پذیرش محتوا خیلی زود است!
نکته: معمولا این خطا در هنگام اعمال تنظیمات سرور برای مدیران فنی ممکن است رخ دهد و کمتر کاربران سایت با آن مواجه می شوند.
کد ۴۲۶، نیاز به ارتقاء (Upgrade Required)
کد وضعیت HTTP 426 در مواقعی کاربرد دارد که سرور امکانات واسط کاربری را نیازمند ارتقاء تشخیص دهد، به طور مثال ممکن است واسط کاربری در بستر نسخه ۱/۰ پروتکل HTTP درخواست را ارسال کرده باشد و سرور نیاز به حداقل نسخه ۱/۱ داشته باشد، یا سرور پروتکل را از HTTP به HTTPS یا Websocket تغییر دهد، در این حالت کد ۴۲۶ به همراه سربرگ Upgrade که در آن نوع ارتقاء ذکر شده برگردانده می شود، در عمل استفاده از کد وضعیت ۴۲۶ خیلی متداول نیست و کد ۱۰۱ Switching Protocols کاربرد بیشتری دارد.
کد ۴۲۸، پیش شرط موردنیاز (Precondition Required)
کد وضعیت HTTP 428 مربوط به تعیین پیش شرط است با این تفاوت که بر خلاف کد ۴۱۲ که واسط کاربری شرط مد نظر را از سرور درخواست می کند در اینجا سرور است که در پاسخ از واسط کاربری می خواهد تا درخواست را با پیش شرط مد نظرش ارسال کند که این کار با تنظیم کد ۴۲۸ Precondition Required و استفاده از یکی از سربرگ های If-Match، If-None-Match، If-Modified-Since و If-Unmodified-Since انجام می شود، معمولا این کار با هدف جلوگیری از تداخل فرآیندهای چند کاربره مانند ویرایش همزمان یک فایل صورت می گیرد.
کد ۴۲۹، تعداد درخواست ها خیلی زیاد (Too Many Requests)
کد وضعیت HTTP 429 مربوط به موقعیتی است که تعداد درخواست های در حال پردازش سرور از میزان توان واقعی یا توان در نظر گرفته شده در تنظیمات سرور بیشتر است، در این حالت سرور می تواند با تنظیم کد وضعیت ۴۲۹ Too Many Requests به واسط کاربری تفهیم کند که به علت تعداد زیاد درخواست های همزمان فعلا قادر به پذیرش درخواست جدید نیست و در صورت تمایل واسط کاربری می تواند در لحظاتی بعد که معمولا در سربرگ Retry-After مشخص می شود مجددا درخواستش را مطرح کند.
تنظیم این کد برای برنامه ها و API هایی که می خواهند به تعداد محدودی کاربر در لحظه پاسخگو باشند می تواند مفید واقع شود.
کد ۴۳۱، اندازه فیلدهای درخواست خیلی زیاد (Request Header Fields Too Large)
کد HTTP 431 در مواقعی کاربرد دارد که مرورگر در درخواست خود حجم زیادی از داده را در یک یا مجموع چند سربرگ ارسال می کند، در این شرایط ممکن است سرور خطای ۴۳۱ Request Header Fields Too Large را برگرداند که در این صورت مرورگر می تواند یک یا چند سربرگ را حذف و مجدد درخواست را ارسال نماید، این کد وضعیت معمولا در خصوص کوکی ها کاربرد دارد.
کد ۴۵۱، به دلایل قانونی در دسترس نیست (Unavailable For Legal Reasons)
کد وضعیت HTTP 451 در مواقعی کاربرد دارد که دسترسی به منبع مورد نظر به دلایل قانونی (به طور مثال مسدود شدن توسط مراجع دولتی) مقدور نیست، در این شرایط سرور می تواند با تنظیم کد ۴۵۱ Unavailable For Legal Reasons واسط کاربری را در جریان این اتفاق قرار دهد، در حالت استاندارد سرور باید در سربرگ Link آدرس مرجع مسئول را نیز ارسال نماید، البته این مرجع سیاستگذار نیست بلکه مرجعی است که مسئولیت قانونی دارد به طور مثال سایت Youtube ممکن است در قسمت Link آدرس سایت Google را قرار دهد.
کدهای سری ۵۰۰، خطای سمت سرور (Server Error)
برخلاف کدهای سری ۴۰۰ که اغلب ناشی از نقص یا خطایی از سمت کاربر است کدهای سری ۵۰۰ به معنی نقص داخلی عموما موقت سرور است، به عبارتی همین که سرور کد خطا برمی گرداند یعنی مشکل اساسی مانند Down کامل وجود ندارد و احتمالا علت خطا باگ نرم افزاری بوده یا اینکه تیم فنی به طور موقت در حال انجام به روزرسانی یا تغییراتی است و در ساعات آینده مشکل رفع خواهد شد.
کد ۵۰۰، خطای داخلی سرور (Internal Server Error)
کد وضعیت ۵۰۰ HTTP به معنی وقوع خطای داخلی در سرور (Internal Server Error) است و معمولا به دلیل نقص تنظیمات یا انجام به روزرسانی نرم افزاری یا سخت افزاری رخ می دهد، تنظیم این کد در مواقعی که می خواهیم در سایت تغییراتی اعمال کنیم که باعث از دسترس خارج شدن موقت آن می شود می تواند مفید باشد و در دانش بهینه سازی برای موتورهای جستجو (SEO) توصیه شده است.
یکی از موارد شایع برای دریافت خطای ۵۰۰ در سرورهای لینوکس دستکاری دستورات فایل htaccess و وجود خطا در این دستورات است.
کد ۵۰۱، غیر مجهز یا تکمیل نشده (Not Implemented)
کد وضعیت ۵۰۱ HTTP بدین معنی است که سرور قادر به پردازش درخواست واسط کاربری نیست (معمولا به دلیل پشتیبانی نشدن متد ارسالی به جهت نقص امکانات مورد نیاز)، این خطا مشابه کد ۴۰۵ Method Not Allowed است با این تفاوت که خطای ۴۰۵ یعنی سرور به کلی از متد پشتیبانی نمی کند اما خطای ۵۰۱ یعنی سرور چنین قابلیتی دارد اما به دلیل نقص تنظیمات در حال حاضر قادر به انجام درخواست واسط کاربری نیست.
کد ۵۰۲، خطای دروازه میانجی (Bad Gateway)
کد وضعیت ۵۰۲ HTTP به دلیل عدم دریافت پاسخ از سرورهای بالادست (Upstream) است و سرور فعلی به عنوان یک دروازه میانجی عمل می کند، در این حالت معمولا بین سرور اصلی و واسط کاربری دروازه های میانجی (Gateway) وجود دارد که قادر به تکمیل فرایند ارسال و دریافت پاسخ نیستند، این خطا ممکن است با چند بار تلاش مجدد از سمت کاربر رفع شود یا اینکه حداقل در کوتاه مدت قابل رفع نباشد.
شایع ترین حالت دریافت خطای ۵۰۲ استفاده از برنامه های پراکسی است که واسط بین مرورگر و سایت مد نظر هستند.
کد ۵۰۳، سرویس خارج از دسترس (Service Unavailable)
دریافت کد وضعیت ۵۰۳ HTTP به معنی غیر قابل دسترس بودن موقت سرور به دلیل ترافیک زیاد (Overload منابع) یا انجام به روزرسانی است، معمولا این حالت پس از چند دقیقه یا چند ساعت به خودی خود رفع خواهد شد، عمدتا سرورها در پاسخ سربرگ Retry-After را جهت تعیین مدت زمان مد نظر جهت تلاش مجدد به صورت نمونه زیر ارسال می کنند:
HTTP/1.1 503 Service Unavailable
Content-Type text/plain
Retry-After: 3600
Server is temporarily unable to handle the request. This may be due to the server being overloaded or down for maintenance.
دریافت این خطا برای سایت های با بازدید بالا محتمل است، مدت زمان در قسمت Retry-After به ثانیه است.
کد ۵۰۴، پایان حداکثر زمان دروازه میانجی (Gateway Timeout)
کد وضعیت ۵۰۴ HTTP نیز بدین معنی است که سرور به عنوان یک دروازه میانجی (Gateway) قادر به دریافت پاسخ از سرورهای بالا دست (Upstream) در حداکثر زمان مجاز نیست.
کد ۵۰۵، نسخه HTTP پشتیبانی نمی شود (HTTP Version Not Supported)
کد وضعیت ۵۰۵ HTTP به معنی پشتیبانی نشدن نسخه پروتکل HTTP است که واسط کاربری از آن استفاده می کند، معمولا سرور دلیل پشتیبانی نکردن از آن نسخه را نیز به همراه سربرگ های پاسخ خود ارسال می کند.
کد ۵۱۱، نیازمند تائید اعتبار شبکه (Network Authentication Required)
کد HTTP 511 مربوط به تائید اعتبار در شبکه های عمومی کنترل شده نظیر Wi-Fi رایگان در هتل ها، رستوران ها، فرودگاه ها، شبکه های اداری، سازمانی و… است که معمولا در ابتدای اتصال به اینگونه شبکه ها جهت استفاده از اینترنت صفحه ورود نام کاربری و کلمه عبور نمایش داده می شود (به این صفحه وب در اصطلاح Captive Portal می گویند) و کاربر باید اطلاعات خود را جهت تائید اعتبار وارد کند، اکثر مرورگرها با دریافت کد ۵۱۱ برای اعتبارسنجی اینگونه شبکه ها پس از ورود و قبل از پیمایش وب به آدرس های URL مد نظرشان درخواست ارسال می کنند تا مطمئن شوند که ارتباط اینترنت واقعا برقرار است، به فرض پس از ورود نام کاربری و کلمه عبور ممکن است به یکی از آدرس های زیر هدایت شویم:
http://detectportal.firefox.com/success.txt
http://connectivitycheck.gstatic.com/generate_204
http://www.msftconnecttest.com/connecttest.txt
http://captive.apple.com/hotspot-detect.html
معمولا تنها باید عبارات متنی کوتاه به فرض success در پاسخ آدرس های استاندارد بالا برگردانده شود که به معنی برقراری موفق اتصال اینترنت است.
نکته: علاوه بر موارد گفته شده که طبق استاندارد W3C هستند، کدهای وضعیت دیگری مربوط به سرورها و پروتکل های متفرقه (مایکروسافت، WebDAV، HTCPCP و…) و سایر برنامه های وب و اپلیکیشن ها وجود دارد که به جهت کاربردهای خاص و عمومی نبودن از ذکر و توضیح آنها خودداری می کنیم.