زمانی که در وب در حال گشت و گذار و مرور صفحات مختلف وب هستیم، کدهایی در پس زمینه بین واسط کاربری ما (مرورگر) و سرور رد و بدل میشوند که به آنها در اصطلاح کدهای وضعیت HTTP یا (HTTP response status codes) میگویند.
کدهای وضعیت HTTP مانند خطاهای ۴۰۴، ۳۰۱ و ۵۰۰ شاید برای یک کاربر معمولی چندان معنایی نداشته باشند، اما برای سئوکاران بسیار مهم هستند. وظیفه رفع این خطاها اکثرا بر عهده برنامه نویس میباشد. از آنجایی که رباتهای موتورهای جستجو مانند ربات گوگل، از این کدها در ارزیابی سلامت یک سایت استفاده می کنند، خوب است که همیشه برنامه نویس ها نسبت به سلامت سایتشان توجه کافی داشته باشند.
این کدها توسط کنسرسیومها و بنیادهای جهانی استاندارد سازی وب از جمله IETF یا (Internet Engineering Task Force) و W3C یا (World Wide Web Consortium) تعریف و سازمان دهی شدهاند و امروزه تقریبا سرور یا مرورگری وجود ندارد که از اصول آنها پیروی نکند.
شاید تا به حال با وارد کردن نام یک وب سایت و یا رفتن به صفحهای از یک وب با خطایی روبهرو شده باشید که از شایعترین آنها میتوان به خطای ۴۰۴ اشاره کرد. کدهای وضعیت HTTP چه به لحاظ فنی و چه به لحاظ کاربری، کاربردهای فراوانی دارند و لذا آشنایی با جزئیات و مفاهیم آنها میتواند به میزان زیادی به توسعه دانش و اطلاعات عمومی وب، کمک کند.
البته به این نکته هم اشاره کنیم که در IIS مایکروسافت ممکن است این خطاها با عددی اعشاری در کنار آن نمایش داده شود، این تنها به این دلیل است که مایکروسافت خطاهای رخ داده را با جزئیات بیشتری به سمع و نظر کاربران میرساند.
برای این مورد میتوانید از قابلیتهای مرورگر برای توسعهدهندگان وب (Web Developers) استفاده کنید، معمولا در مرورگرهایی مثل فایر فاکس، گوگل کروم و... قسمتی تحت عنوان ابزارهای توسعهدهندگان (Developers Tools) یا عناوینی شبیه آن وجود دارد که تمام فعل و انفعالات واسط کاربری (User Agent) و سرور را نشان میدهد. نکته قابل توجه برای علاقهمندان این است که برای شروع فعالیت در این حوزه، باید با مفاهیم و دانش پایه برنامه نویسی آشنایی داشته باشند.
بریم با لیست کدهای وضعیت HTTP آشنا شویم :
قبل از شروع اشاره کنیم به اینکه، هر وب سرور درخواست هایی را که دریافت میکند را با یک کد وضعیت خاص پاسخ دهی مینماید. هر کد وضعیت HTTP از ۳ عدد تشکیل شده و به صورت کلی به ۵ گروه مختلف تقسیم میشود.
اولین رقم آنها نمایان گر گروه و یا کلاس آنها میباشد که برای شناسایی یا تعریف کد مورد نظر در یک دستهبندی خاص استفاده میشود که یکی از پنج حالت زیر است:
حال با توجه به آشنایی به سریهای مختلف میتوان به راحتی حدس زد که اگر خطایی با پیش شماره ۴ رخ داد، مربوط به خطایی است که از سمت کاربر رخ داده و یا اگر خطایی مانند ۵۰۳ رخ داد ، شما متوجه خواهید شد این خطا مربوط به سرور است.
اولین سری از کدهای HTTP، با عدد ۱۰۰ شروع میشود که در مورد نقل و انتقال بستههای اطلاعات مثل ارسال و دریافت فایل، کاربرد دارند و حالت موقت پاسخ سرور را نشان میدهند، به فرض وقتی از متد POST در فرم های وب استفاده میکنیم، دریافت کد ۱۰۰ به معنی این است که سرور درخواست ما را پذیرفته و فرآیند پردازش اطلاعات ادامه دارد، البته بدون ارسال کد ۱۰۰ نیز این فرآیند ادامه می یابد لذا ارسال آن از طرف سرور ضروری نیست.
کاربر به سرور درخواست تغییر پروتکل را داده و سرور در حال تأیید این درخواست میباشد. در برنامههایی که از آژاکس (Ajax) استفاده میکنند، این کد میتواند کاربرد داشته باشد.
وقتی سرور در حال پردازش درخواستهای کاربر باشد، این وضعیت نمایش داده خواهد شد. از سرور با ارسال کد ۱۰۲ به مرورگر میگوید که عملیات درخواستی، دریافت شده و در حال پردازش است.
این کد زمانی رخ میدهد که سرور در حال بازخوانی درخواست کاربر برای استفاده از متد PUT یا POST و حذف درخواست اضافی میباشد. این کدها، عموماً در معرض نمایش کاربران نیستند و سرورها با این کدها با سیستم کاربر صحبت کرده تا ارتباط حفظ شود و درخواستها به درستی ارسال و دریافت گردد.
سرور درخواست ارسال شده را با موفقیت پردازش کرده و صفحه وب درخواستی بدون هیچ تغییر فراهم است. کدهای سری ۲۰۰ معمولا به معنی بی نقص بودن درخواست و عملکرد صحیح سرور است.
کد استاندارد HTTP در وب، با عدد ۲۰۰ نشان داده میشود، دریافت پاسخ ۲۰۰ از سرور به این معنی است که آدرس درخواستی (در متد GET) یا عملیات مورد نظر (در متد POST) به طور کامل و موفقیت آمیز توسط سرور انجام شده است، در یک ارتباط بدون نقص بین واسط کاربری (user agent) و سرور، کدهای سری ۲۰۰ باید دریافت شوند.
درخواست ارسالی موفقیت آمیز بوده و سرور برای ارسال درخواست یک منبع جدید ایجاد کرده است. ارسال کد ۲۰۱ تنها در صورتی صحیح است که سرور منبع جدید را ساخته باشد، در غیر اینصورت (اگر منبع هنوز ساخته نشده باشد) باید کد ۲۰۲ را ارسال کند.
سرور درخواست موافقت شده را هنوز محاسبه نکرده است. کد ۲۰۲، به این معنی است که با درخواست واسط کاربری موافقت شده، اما پردازش عملیات به طور کامل صورت نگرفته است، به همین دلیل تا پایان پردازش عملیات درخواستی، ممکن است تقاضای کاربر کامل شده یا برعکس، رد شود.
سرور درخواست موافقت شده را پردازش کرده است ولی اطلاعات ارسالی (در پاسخ سرور) از یک منبع غیر معتبر است (به فرض کپی ازاطلاعاتی است که درستی آن تایید نمی شود)، تنظیم این کد در سرورها معمولا غیر ضروری است و میتوان به جای آن کد ۲۰۰ را ارسال کرد.
سرور با موفقیت درخواست را پردازش کرده اما محتوایی برای نمایش وجود ندارد. معمولا دریافت این پاسخ از سرور، بدین معنی است که آدرس درخواستی هیچ گونه تغییری از آخرین درخواست تا لحظه کنونی نداشته است و فایل یا صفحه مربوطه به همان صورت قبلی نشان داده میشود.
کد ۲۰۵ همانند کد ۲۰۴ است، یعنی در اینجا نیز هیچ محتوایی از طرف سرور ارسال نمی شود، اما در سمت کاربر، اطلاعات فعلی بازنشانی یا Reset می گردند که این معمولا منجر به ایجاد محتوای خالی می شود، این کد مخصوصا برای پاک کردن اطلاعات فرم های وب می تواند مورد استفاده قرار گیرد.
درخواست با موفقیت پردازش شده ولی سرور محتوا جزئی را نمایش خواهد داد. از این کد برای حالتهایی که به فرض از امکاناتی نظیر ادامه دانلود (resume download) استفاده میکنیم، کاربرد دارد، با ارسال این کد توسط سرور، به قسمت خاصی از درخواست واسط کاربری به صورت جزئی پاسخ داده میشود.
کدهای سری ۳۰۰ مربوط به مواردی هستند که پاسخ به درخواست واسط کاربری از سرور، باید با انجام اعمال دیگری (در سمت کاربر) کامل شود، این عملیات معمولا توسط واسط کاربری (مثلا مرورگر) و بدون دخالت کاربر (به صورت خودکار) انجام میشود، به فرض عمل ریدایرکت یا انتقال خودکار از یک آدرس به آدرس دیگر، با ارسال کدهای سری ۳۰۰ انجام میشود، نکته مهم در اینجا این مسئله است که ریدایرکتها نباید در یک درخواست، بیش از ۵ بار تکرار شوند، در غیر اینصورت در اکثر مرورگرها، فرض بر حلقه (Loop) بیانتها شده و ارتباط قطع خواهد شد.
سرور لیستی از لینکها را نمایش داده و کاربر میتواند آنها را انتخاب کرده و به آن مکان برود. کد ۳۰۰ برای مواقعی است که سرور در پاسخ به درخواست واسط کاربری، چند منبع مختلف را پیشنهاد میدهد (مثلا یک فایل با فرمت های مختلف) و انتخاب یک URL را به عهده مرورگر کاربر میگذارد، عمل انتخاب نیز معمولا یا به صورت خودکار انجام میشود یا اینکه سرور یکی از URLها را به عنوان پیش فرض برگزیده و همراه پاسخ خود ارسال می کند.
کد ۳۰۱ یکی از مهمترین و حساسترین کدهای HTTP مخصوصا در علم سئو است، دریافت این کد از طرف سرور، به معنی انتقال همیشگی یک آدرس وب، به آدرسی دیگر است، از این کد مخصوصا هنگامی که در آدرس لینکهای سایت، به هر دلیل تغییراتی ایجاد میشود، میتوان جهت هدایت رباتهای خزنده یا کاربران به لینک اصلی، استفاده کرد.
درخواست صفحه مورد نظر شما به صورت موقت به صفحه جدیدی ریدایرکت خواهد شد. این حالت با کد ۳۰۱ متفاوت است، در اینجا انتقال به صورت موقت انجام شده و آدرس اصلی همچنان معتبر و در دسترس خواهد بود، اما در ریدایرکت ۳۰۱، منظور از انتقال، انتقال همیشگی، حذف آدرس فعلی و جایگزینی آن با آدرس جدید است.
این خطا در هنگامی رخ میدهد که کاربر باید برای دریافت درخواست خود به محل دیگری مراجعه کند. این کد مشابه کد ۳۰۲ عمل میکند، تفاوت در اینجا، تاکید روی متد GET است، در کد ۳۰۳ آدرس فعلی و آدرسی که کاربر به آن منتقل میشود، باید از طریق متد GET درخواست شوند که در حالت معمول نیز به اینصورت خواهد بود.
هنگامی که سرور این وضعیت را نمایش میدهد بدین معناست که از آخرین باری که درخواست ارسال شده ، صحفه مورد نظر اصلاح نشده است و در این حالت سرور به اجبار یک صفحه خالی به شما نمایش خواهد داد.
کاربر زمانی میتواند از صفحه مورد درخواست استفاده کند که از پروکسی استفاده کرده باشد.پروکسی در واقع سرور میانجی بین واسط کاربری و سرور اصلی است، از این رو و به دلایل امنیتی برخی مرورگرها مانند فایرفاکس و اینترنت اکسپلورر، از این قابلیت پشتیبانی نمیکنند.
کد ۳۰۶ هم مشابه کد ۳۰۵ است و مربوط به درخواست تغییر پروکسی، این کد در حال حاضر کاربردی ندارد.
همانند کد ۳۰۲ عمل کرده اما نوع ریدایرکت موقت آن کمی متفاوت خواهد بود. این حالت با ریدایرکت ۳۰۲ و ۳۰۳ فرق دارد، در اینجا انتقال نیاز به تایید کاربر داشته و به صورت خودکار انجام نمیشود، متدهای استفاده شده نیز باید بین لینک اصلی و لینک انتقالی مشترک باشد، بقیه شرایط مشابه کدهای ۳۰۲ و ۳۰۳ است و واسط کاربری باید لینک فعلی را همچنان و در مراجعات بعدی به عنوان لینک اصلی مد نظر قرار دهد.
سرور قادر به تشخیص نوع درخواست کاربر نیست. کدها یا میتوان گفت خطاهای سری ۴۰۰ مربوط به رویداد خطایی از جانب کاربر (سمت کاربر) در ارائه درخواست به سرور است، در پاسخ، سرور معمولا و به طور پیش فرض، به همراه کدهای HTTP عباراتی در توضیح خطای رخ داده ارسال میکند و دائمی یا موقتی بودن مشکل به وجود آمده را نیز تعیین خواهد کرد.
خطای ۴۰۰ به دلیل درک نشدن شیوه نگارش (syntax) درخواست واسط کاربری از سرور رخ میدهد، در این حالت مفهوم تقاضای کاربر برای سرور روشن نیست و درخواست قابل پردازش نمیباشد، این خطا ممکن است به دلایل دیگر، از جمله نقص در انتقال دادهها (به فرض به دلیل قطع یا افت سرعت ارتباط) نیز رخ دهد.
خطای ۴۰۱ به دلیل درخواست ارسالی غیر مجاز است. در این حالت ممکن است نیاز با لاگین باشد. در این حالت منبع درخواستی به طور کامل محدود نشده است، بلکه درخواست کاربر نیاز به تایید مجوزهای دسترسی (به طور معمول نام کاربری و کلمه عبور) دارد، به همین دلیل سرور در پاسخ خود یک فرم از نوع WWW-Authenticate را ارسال کرده و از کاربر میخواهد تا اعتبار خود را اثبات کند.
خطای ۴۰۲ نماینگر استفاده از بخشی است که کاربر باید هزینه پرداخت نماید و پس از پرداخت این بخش باز خواهد شد. هدف از تعریف آن مربوط به حسابهای کاربری است که نیاز به پرداخت وجه دارند، البته در عمل تا کنون چنین اتفاقی رخ نداده است و از کد ۴۰۲ استفاده چندانی نمیشود.
خطای ۴۰۳ (Forbidden: Access is denied) میگوید استفاده از این صفحه برای کاربر ممنوع میباشد. به طورمثال اگر سایتی کاربران یک بخش یا یک کشور را تحریم کرده باشد با این خطا روبهرو خواهید شد. این حالت با خطای ۴۰۱ متفاوت است، در اینجا حتی با ورود نام کاربری و کلمه عبور نیز امکان دسترسی مقدور نخواهد بود، معمولا مدیران سایتها، دسترسی مستقیم به فولدرها و نمایش فایلها به صورت لیست را غیر فعال میکنند، در نتیجه وقتی آدرس یک فولدر را از آن سرور درخواست میکنیم، با خطای ۴۰۳ مواجه خواهیم شد.
برخی دلایلی که باعث بروز این خطای ۴۰۳ میشود به شرح ذیل می باشد :
خطای ۴۰۴ میگوید سرور قادر به پیدا کردن صفحه درخواست شده کاربر نمیباشد و یا صفحه مورد نظر به کل وجود ندارد. خطای ۴۰۴ در مواقعی رخ میدهد که واسط کاربری تقاضای منبعی (به طور مثال یک فایل یا صفحه) را از سرور دارد که در حال حاضر موجود نبوده یا حذف شده است.مثلا:
خطای ۴۰۵ اشاره میکند به این پیتم که متد درخواستی کاربر مجاز نمیباشد. به فرض استفاد ه از متد GET در حالتی که منبع درخواستی نیاز به ارسال منابعی از طریق متد POST دارد، یا استفاده از PUT در نوشتن یک فایل، برای فایل هایی که فقط حالت خواندنی دارند (Read-Only)، در این حالت، معمولا سرور در پاسخ، متد مجاز را نیز ارسال خواهد کرد.
سرور قادر به پاسخ دهی درخواست شما با این متد نمیباشد. خطای ۴۰۶ ممکن است به دلیل وجود کاراکترهای غیر استاندارد در درخواست ارسالی رخ دهد، برخی از سرورها به دلایل امنیتی نیز ممکن است این کد را در پاسخ ارسال کنند، به طور مثال ماژول mod_security در سرورهای Apache از پذیرفتن برخی آدرسهای وب (که از نظر امنیت، سرور آنها را مشکوک تشخیص دهد) خودداری کرده و پیام Not Acceptable دریافت خواهید کرد.
عملکرد خطای ۴۰۷ نیز شبیه کد ۴۰۱ است، با این تفاوت که در اینجا ابتدا کاربر (واسط کاربری) باید از طریق یک پروکسی اعتبار خود را اثبات کند.
انتظار سرور برای ارسال درخواست از سمت کاربر به پایان رسیده است. به این صورت سرور خطای ۴۰۸ را ارسال میکند و واسط کاربر میتواند مجددا و در دفعات بعدی درخواست خود را ارسال کند.
خطای ۴۰۹ به معنی تداخل یا تعارض درخواست کاربر با عملیاتی دیگر در سرور بر روی منبع مورد نظر است، به طور مثال وقتی دو کاربر به صورت همزمان در حال ویرایش یک فایل هستند و هر دو آن را ذخیره میکنند، ممکن است این خطا رخ دهد که باید به صورت دستی آن را رفع کرد.
خطای ۴۱۰ به معنی حذف همیشگی منبع درخواستی از سرور است، بر خلاف خطای ۴۰۴، خطای ۴۱۰ به واسط کاربری یا موتورهای جستجو میگوید که نباید مجددا آن منبع را درخواست کنند، چرا که برای همیشه حذف شده است، البته در عمل موارد استفاده از این کد خیلی محدود است و تنظیم خطای ۴۰۴ بهتر و اصولیتر است.
خطای ۴۱۱ به این معنی است که سرور از پاسخ به درخواست واسط کاربری خودداری میکند، چرا که در درخواست ارسالی اندازه یا طول محتوا (Content-Length) وجود ندارد، در این حالت معمولا واسط کاربری باید در سربرگهای HTTP درخواست خود آن را اضافه کند.
خطای ۴۱۲ زمانی رخ میدهد که سرور در هنگام دریافت درخواست کاربر برخی از پیششرطها یا پیشنیازها را دریافت نکرده است.
خطای ۴۱۳ زمانی رخ کمیدهد که سرور قادر به پردازش درخواست شما به دلیل بزرگ بودن آن نیست. لذا ارتباط توسط سرور قطع خواهد شد، اما اگر این حالت موقتی باشد، معمولا در پاسخ، سربرگ Retry-After نیز ارسال میشود و واسط کاربری مجددا و در دفعات بعدی میتواند درخواست خود را ارسال کند.
خطای ۴۱۴ به معنی بیش از حد طولانی بودن آدرس وب (URI) درخواستی است و سرور قادر به پردازش آن نیست.
خطای ۴۱۵ به دلیل ارسال فرمتی به همراه درخواست ارسالی (به فرض آپلود یک فایل یا تصویر) است که از نظر سرور قابل پذیرش نیست و سرور فرمت دیگری را پشتیبانی میکند.
خطای ۴۱۶ زمانی رخ میدهد که سرور در حالتی این کد را نمایش خواهد داد که بخشی از یک صفحه درخواستی کاربر برای پردازش سرور قابل قبول نیست.
سرور قادر به برقراری حداقلهای فیلد درخواست هدر فایل نیست و واسط کاربری با انتظارات و موارد مورد نیاز سرور همخوانی ندارد یا سربرگی ارسال نشده است.
خطای «I’m a teapot» یا «من یک قوری هستم» برمیگردد به سال ۱۹۹۸ یعنی حدود به ۲۰ سال پیش، که در آن سال به عنوان یک شوخی برای دروغ اول آوریل در استانداردها قرار داده شد و حتی در ضمن همین شوخی، پروتکلی بهعنوان «پروتکل فرامتنی کنترل قوری قهوه» (HTCPCP) نیز برای کنترل نحوه دم کردن قهوه در قوری وضع شد!
با اینکه این کد صرفا در حد یک شوخی است، اما خطای ۴۱۸ هنوز در فهرست کدهای خطا وجود دارد و در برخی از سایتها این کد بامزه پیاده شده است.
برای نمونه میتوانید با رفتن به آدرس google.com/teapot خطای قوری گوگل را ببینید! فراموش نکنید روی قوری کلیک کنید تا برایتان قهوه هم در فنجان بریزد!
در حال حاضر سرور در هنگام پردازش با خطا روبهرو شده است. با این حال سرور در مجموع سالم بوده و احتمالا به طور موقت در حال انجام به روزرسانی یا تغییراتی است و در ساعات آینده مشکل رفع خواهد شد.
خطای ۵۰۰ معمولا به دلیل نقص تنظیمات یا انجام به روزرسانی نرم افزاری یا سخت افزاری رخ میدهد، تنظیم این کد در مواقعی که میخواهیم در سایت، تغییراتی اعمال کنیم که باعث از دسترس خارج شدن آن می شود، میتواند مفید باشد.
خطای ۵۰۱ بدین معنی است که سرور قادر به پردازش درخواست واسط کاربری نیست. معمولا به دلیل پشتیبانی نشدن متد ارسالی یا نقص امکانات مورد نیاز این خطا رخ میدهد.
خطای ۵۰۲ به دلیل عدم دریافت پاسخ از سرورهای بالادست (Upstream) است و سرور فعلی به عنوان یک دروازه میانجی عمل میکند، در این حالت معمولا بین سرور اصلی و واسط کاربری، دروازههای میانجی (Gateway) وجود دارند که قادر به تکمیل فرایند ارسال و دریافت پاسخ نیستند، این حالت معمولا با چند بار تلاش مجدد از سمت کاربر رفع خواهد شد.
دریافت خطای ۵۰۳ به معنی غیر قابل دسترس بودن سرور به دلیل ترافیک زیاد (Overload) یا انجام به روزرسانی است، معمولاً این حالت موقتی بوده و پس از چند دقیقه یا چند ساعت رفع خواهد شد.
خطای ۵۰۴ نیز بدین معنی است که سرور به عنوان یک دروازه میانجی (Gateway) قادر به دریافت پاسخ از سرورهای بالا دست (Upstream) در حداکثر زمان مجاز نیست. اگر بخواهیم به طور کلی به دلایل رخداد این خطا اشاره کنیم میگوییم:
خطای ۵۰۵ به معنی پشتیبانی نشدن نسخه HTTP پروتکلی است که واسط کاربری از آن استفاده میکند، معمولا سرور دلیل پشتیبانی نکردن از آن نسخه را نیز به همراه سربرگهای پاسخ خود ارسال میکند. علاوه بر موارد گفته شده که طبق استاندارد RFC 2616 W3C است، کدهای دیگری مربوط به سرورهای مایکروسافت و سایر پروتکلهای وب وجود دارد که به جهت کاربردی نبودن از ذکر آنها خودداری کردهایم.
برخی از کدها هستند که توسط هیچ استاندادری مشخص نشدهاند.
کدهای سری 4XX که شامل خطاهای 444، 494، 495، 496، 497 و 499 که مربوط به خطاهای Nginx است که اشاره به ارورهای مربوط به درخواست کاربر میکنند. و خطاهای سری 5xx که شامل 520، 521، 522، 523، 524، 525، 526، 527 و 530 مربوط به Cloudflare و خطاهای سمت سرور میباشد.
در این مطلب با اکثر کدها و خطاهای HTTP آشنا شدیم. به طور کلی خطاهای سری ۴۰۰ مربوط به سمت کاربر و خطاهای سری ۵۰۰ مربوط به سمت سرور میباشد. حال با توجه به آشنایی به سریهای مختلف میتوان به راحتی حدس زد که اگر خطایی با پیش شماره ۴ رخ داد، مربوط به خطایی است که از سمت کاربر رخ داده و یا اگر خطایی مانند ۵۰۳ رخ داد، شما متوجه خواهید شد این خطا مربوط به سرور است.
در اکثر مواقع خیلی ساده از کنار این خطاها گذر میکنیم ، اما اگر این خطاها بر روی وب سرور خودمان هم اتفاق بیافتد، به همین شکل از آن گذر میکنیم؟
پس به عنوان یک کلاینت حرفهای وب و یا به عنوان کسی که سعی دارد وب و دنیای اینترنت را به صورت حرفهای فرا بگیرد باید این کدها را بشناسید و دلایل رخ دادن آنها را بدانید.