آنچه در این صفحه میخوانید
همگی ما اهمیت انتقال پیام و احساس را از طریق وبسایت به خوبی درک میکنیم و میدانیم که عدم سردرگمی کاربران با دیدن خطاهایی نظیر 404 در صفحه تا چه میزان مفید است و ممکن است به او در پیدا کردن چیزی که دنبالش میگردد کمک میکند. راههای متعددی برای دستیابی به این مهم وجود دارد که معروفترین آن استفاده از فایل .htaccess با قرار دادن کدهای لازم در آن است.
در این مقاله ما نحوه ایجاد صفحهی خطاهای رایج به صورت اختصاصی و همچنین نحوهی تغییر پیغام نمایشی در آنها میپردازیم اما پیش از آن برای روشنتر شدن مطلب، انواع خطاهای رایج و دلایل وقوع آنها را بررسی میکنیم.
خطاهای رایج HTTP و دلایل وقوع آن
1- 400: خطای 400 یا 400 Bad Request Error به معنای این است که نرمافزاری که از آن استفاده میکنید (برای مثال مرورگرتان)، از طریقی نامتعارف سعی بر دسترسی به وبسایت و سرور وب دارد و یا درخواستی که به سمت سرور ارسال کرده است به هر دلیلی در میان راه خراب شده است؛
برای مثال:
- کوکی ذخیره شده در مرورگر کاربر متعلق به سایت مورد نظر خراب شده است. با پاک کردن کش و کوکی مرورگر مشکل حل میشود.
- به دلیل وجود مشکل در مرورگر، درخواستها به صورت ناقص ارسال میشود.
- به دلیل اشتباه در کدنویسی، به هنگام دسترسی به سرور مقصد با این مواجه میشوید. برای مثال استفاده از کدهای cURL به صورت نادرست
2- 401: خطای 401 یا 401 Unauthorized Error زمانی رخ میدهد که بازدیدکنندهای تلاش به دسترسی به صفحهای دارد که به طور کلی دسترسی به آن صفحه با محدودیتهایی از پیش تعیین شده توسط مدیر وبسایت مواجه بوده و یا خود آن بازدیدکننده به دلیلی اجازهی دسترسی به صفحه را ندارد؛ این مورد میتواند به دلیل تلاشهای ناموفق بازدیدکننده در هنگام وارد کردن Username و Password جهت ورود رخ داده باشد.
3- 403: خطای 403 یا 403 Forbidden Error به معنای این است که کاربر به درستی درخواستی معتبر و صحیح را به سمت سرور ارسال کرده است اما سرور از پاسخگویی به آن درخواست سر باز میزند که ناشی از نبود مجوز به انجام درخواست مورد نظر است.
به عنوان توضیح بیشتر، برخی از دلایل وقوع این خطا را در ادامه شرح میدهیم:
مورد اول: سطح دسترسی نادرست
خطای 403 معمولا زمانی اتفاق میافتد که که وبسرور Permission و یا همان سطح دسترسی لازم جهت خواندن محتوای فایلها را ندارد و از آنجا که امکان خواندن اطلاعات را ندارد، آنها را نمیتواند در اختیار کاربر قرار دهید و با خطای 403 مواجه میشوید. برای مثال:
- کاربر از طریق فایل Index وبسایت مثل example.com/index.html به صورت غیر مجاز قصد دسترسی مستقیم به سرور وب دارد که به دلیل مسائل امنیتی امکان انجام این امر را ندارد.
- سطح دسترسی فایل Index یا پوشهی روت وبسایت به درستی تنظیم نشده باشد.
- فایلهای اصلی وبسایت و فایل Index را در مسیری نادرست قرار داده شده باشد و در سرور مسیر صحیح برای فراخوانی آن تعریف نشده باشد (مثلا در فایل کانفیگ Virtual Host مسیردهی درست صورت نگرفته باشد)
مورد دوم: عدم وجود صفحهی Index
نام فایل Index وبسایت شما (صفحهی اصلی وبسایتتان)، مواردی به جز Index.html یا Index.php و موارد معمول دیگر است. برای مثال نام فایل اشتباهاً home.html تعریف شده باشد.
مورد سوم: .htaccess
عامل احتمالی دیگر برای وقوع خطای 403، وجود فایل .htaccess در اکانت است. چنانچه درون محتوای این فایل کدهایی باشد که تعدادی خاص و یا تمامی IPها را از ورود به برخی صفحات وبسایت منع کرده باشد، IPهای مورد نظر در بازدید از آن صفحات با خطای 403 مواجه میشوند.
مورد چهارم: اعمال محدودیت از سمت هاست
گاهاً اتفاق میافتد وبسایتها به دلیل بازدیدهای بالا، منابع زیادی از سرور را مصرف میکنند. مصرف بیش از حد از منابع RAM یا CPU یا حتی MySQL، ممکن است موجب ایجاد کندی در سرعت دسترسی به وبسایت برای کاربرهای موجود در سرورهای میزبانی وب اشتراکی شود. متاسفانه برخی از شرکتها بدون اطلاع قبلی و ارائه فرصت و راهحل مناسب، وبسایت کاربران را بسته و موجب ایجاد محدودیت در دسترسی آنها به وبسایت میشوند. یکی از خطاهایی که بازدیدکنندگان پس از اعمال محدودیت (با کاهش سطح دسترسی دایرکتوری) با آن مواجه میشوند، همان خطای 403 است.
4- 404: خطای 404 یا 404 Not Found Error از معروفترین خطاهای رایج است که ممکن است در هر وبسایتی رخ دهد. خطای 404 زمانی روی میدهد که بازدیدکننده قصد مشاهدهی صفحه یا محتوایی از وبسایت را داشته باشد که آن صفحه یا محتوا در سرور وجود نداشته باشد. این خطا معمولا به دلایل زیر روی میدهد:
- فایل یا صفحه مورد نظر از سرور حذف شده باشد.
- آدرس دسترسی به فایل یا صفحه به آدرسی جدید تغییر یافته باشد.
- بازدیدکننده آدرسی (URL) به صورت نادرست در مرورگر وارد کرده باشد.
- تنظیمات مربوط به پوشهای که اطلاعات وبسایت از طریق آن خوانده میشود در سرور اشتباه اعمال شده باشد.
- به دلیل عدم وجود تنظیمات صحیح در سرور، وبسرور امکان و اجازهی دسترسی به فایلها و دایرکتوریها را نداشته باشد.
- بسیاری از عملکردهای وبسایت توسط کدهای فایل .htaccess مدیریت میشود و کدهای لازم از این فایل حذف شده باشند.
- اطلاعات وبسایت در سرور از طریق یک لینک Symbolic قابل دسترسی باشد. در این صورت باید مطمئن شویم آن سرور قابل خواندن و اجرای لینکهای Symbolic است.
5- 500: خطای 500 یا 500 Internal Server Error به معنای آن است که سرور به دلیلی نامعلوم امکان پردازش و انجام درخواستی که به سمتش میآید را ندارد. اما وقوع این مورد جای نگرانی ندارد؛ چرا که پیدا کردن منشأ اصلی وقوع خطای 500 برای کارشناسان هایساپورت بسیار ساده است.
از عمدهترین دلایل وقوع خطای 500 میتوان به وجود کدهای غیر صحیح در فایل .htaccess، وجود فایل php.ini به خصوص حاوی محتوای نادرست و همچنین سطح دسترسی نادرست فایلها و دایرکتوریها اشاره کرد.
6- 502: خطای 502 یا 502 Bad Gateway به این معناست که سرور مورد نظر ما به عنوان یک Gateway یا سرورِ پروکسی عمل میکند و درخواست کاربر را جهت اجرا به سرورهای دیگر نیز ارسال کرده است اما پاسخ معتبری از سوی آن سرورها جهت دریافت دیتا و یا در نهایت به انجام رساندن درخواست کاربر دریافت نمیکند. حال جهت رفع این مشکل لازم است سرورهای دیگر را بررسی نمود. همچنین تنظیمات سرور فعلی و یا حتی سلامت و بدون نقص بودن ارتباط شبکهای آن با سرورهای دیگر را بررسی کرد و مطمئن شد تا فایروالی مابین آنها ارتباط را قطع نمیکند.
7- 503: خطای 503 یا 503 Service Unavailable زمانی رخ میدهد که سرور Overload شده باشد و یا برای مدتی اندک در حال تعمیرات خاصی باشد. این خطا چنین معنای ضمنی را میدهد که سرویس مورد نظر شما اعم از سرویس میزبانی وب و یا ... به زودی در دسترس قرار میگیرد.
در صورتی که سرور در حال تعمیرات نباشد، این خطا نشاندهندهی این است که سرور منابع CPU یا Memory کافی جهت مدیریت درخواستهای دریافتی را ندارد و در نتیجه یا نیاز به منابع بیشتر است و یا میبایست تنظیم وبسرور به نحوی انجام شود که امکان مدیریت تعداد درخواست، پروسه و بازدیدهای بیشتری را داشته باشد.
8- 504: خطای 504 یا 504 Gateway Timeout به این معناست که سرور مورد نظر ما به عنوان یک Gateway یا سرورِ پروکسی عمل میکند و درخواست کاربر را جهت اجرا به سرورهای دیگر (Backend Servers) ارسال کرده است اما به صورت کلی پاسخی از سوی آن سرورها طی بازهی مشخصی دریافت نکرده است.
فرق این خطا با خطای 502 این است که در این خطا از سمت سرورهای دیگر پاسخی دریافت نمیشود اما در خطای 502 پاسخ به صورت ناقص و یا نامعتبر دریافت میشود.
خطای 504 معمولا به دلیل ارتباط ضعیف شبکه بین سرورها، کندی در به انجام رساندن درخواستها توسط Backend Servers و یا اتمام زمانی از پیش تعیین شده در سرور رخ میدهد. بسیاری از مواقع با Refresh سادهی مرورگر و یا ریست سرویسها و سرور و تجهیزات شبکه مشکل رفع میشود. همچنین گاهاً تنظیمات پروکسی سرور نادرست در مرورگر یا اپلیکیشنها موجب بروز این خطا میشود. تغییر DNS Serverهای کامپیوتر، سرور یا دامنه نیز میتواند مشکل را در بسیاری از مواقع رفع کند. در صورتی که موارد فوق مشکل بوجود آمده را رفع نکرد، محتوای فایل .htaccess را بررسی کنید، با ISP تماس حاصل فرمایید و یا دیتابیس وبسایت یا اپلیکیشن خود را Repair کنید. موارد بسیاری دیگری نیز جهت انجام بررسی مهم هستند که در صورت کارساز نبودن موارد فوق، متخصصین فنی ما حاضر به انجام بررسی و رفع مشکل هستند.
ایجاد صفحه خطای اختصاصی
ایجاد صفحه خطای اختصاصی به این معناست که مثلا لحظهای وبسایت شما با یکی از خطاهای رایج HTTP که در بالا در مورد برخی از آنها صحبت شد، مواجه میشود؛ برای مثال فایل یا صفحهای وجود ندارد و بازدید کننده با وارد کردن آدرسی که در سرور و وبسایت شما وجود ندارد با خطای 404 مواجه میشود. حال ممکن است او معنی این خطا را نداند و یا حتی اگر بداند باز دچار سردرگمی شود و از بازدید وبسایت شما منصرف شود. در این شرایط چنانچه ما از پیش صفحهای ساخته باشیم تا بازدیدکننده به جای مواجهه با خطای 404، وارد صفحهای شود که به درستی به او این پیغام را دهد که «فایل مورد نظر وجود ندارد؛ ممکن است این فایل به دلیلی حذف و یا جابهجایی آن به مسیر دیگر روی داده باشد»، این گونه بازدیدکننده حس بهتری نسبت به آن خطا پیدا میکند. حال آنکه در همان صفحهای که ساختیم بهتر است بازدیدکننده را راهنمایی کنیم تا به خواستهاش برسد و فایل یا آدرس و مطلب مورد نظرش را پیدا کند و یا حداقل با ارائه اطلاعات تماس و دسترسی آسان به بهش پشتیبانی و مدیریت وبسایت، به ما اطلاع دهد که به چه چیز نیاز داشته و نتوانسته به آن دست پیدا کند تا ما بتوانیم هم نیاز او و هم نیاز بازدیدکنندگان مشابه را برطرف کنیم.
جهت ایجاد صفحهی خطای اختصاصی، موارد زیر را انجام دهید:
1- وارد فایل .htaccess شوید.
2- کد زیر را در فایل .htaccess قرار دهید:
# htaccess custom error pages >ErrorDocument 400 /errors/400.html ErrorDocument 401 /errors/401.html ErrorDocument 403 /errors/403.html ErrorDocument 404 /errors/404.html ErrorDocument 500 /errors/500.html
موارد مشابه را نیز میتوانید اضافه نمایید. برای مثال خطای 502، 503، 504 و ...
برای اینکه کدها قرار داده شده در فایل .htaccess مطابق با مورد بالا به درستی کار کند، لازم است پوشهای در مسیر اصلی هاست خود (Root یا Public_html) ایجاد کنید و نام آن را «errors» قرار دهید. سپس فایلهای HTML که از پیش برای خطاهای مختلف ساختهاید را درون آن قرار دهید. پیشنهاد ما طراحی فایلهای HTML به نحوی است که ساختار وبسایت را حفظ کند و رنگهای بکار برده در آن مشابه رنگ و طرحهای استفاده شده در پوستهی وبسایت باشد.
برای خیلیها سوال است که چرا فایلهای مربوط به صفحهی خطا را به صورت Dynamic یعنی با PHP نسازیم و آن را به صورت Static یعنی بر اساس کدهای HTML ایجاد کنیم. یکی از دلایل انجام این امر این است که با بازدید صفحات PHP، اطلاعات از طریق دیتابیس فراخوانی میشود و در نتیجه ارجاعی به سمت دیتابیس صورت میگیرد که لازم است پردازش آن در دیتابیس انجام شود. حال آنکه چنانچه تعداد این بازدیدها بالا باشد، برای مثال روباتی به صفحهای که در وبسایت شما وجود ندارد حمله کند و به صورت مداوم با صفحهی 404.php مواجه شود که لازم است از طریق دیتابیس پردازش شود. این مورد موجب بالاتر رفتن لود سرور و افزایش پروسههای در حال اجرا میشود. پس به طور کلی استفاده از صفحات HTML در این بخش موجب کاهش لود سرور و عدم استفاده زیاد و فشار کمتر به منابع سختافزاری آن میشود.
گاهاً ممکن قصد ایجاد صفحات خطای اختصاصی نداشته باشید. در این صورت پیشنهاد ما جهت کاربرپسندی بیشتر تغییر پیغامی است که به جای خطای پیشفرض وبسرور، بازدیدکننده با آن مواجه میشود. جهت انجام اینکار در ادامه با ما همراه باشید...
تغییر پیام پیشفرض خطای وبسرور
1- فایل .htaccess را جهت ویرایش باز کنید.
2- عبارات زیر را درون آن قرار دهید:
# htaccess custom error messages >ErrorDocument 400 "Ooops - Bad request! ErrorDocument 401 "Speak friend and enter ErrorDocument 403 "Strictly fabidden... ErrorDocument 404 "Missing in action... ErrorDocument 500 "Server gone wild...
در این مثال ما از عبارات انگلیسی استفاده کردهایم. در صورتی که مخاطبان شما فارسیزبان هستند، عبارات را به موردی دلخواه و به زبان شیرین فارسی تغییر دهید.
در نکتهی فوق مشخص شد که میتوانید از کدهای HTML نیز در متن خطا استفاده کنید. نمونهای از این کدها به عنوان جایگزین عبارت فوق در زیر قرار داده شده است:
ErrorDocument 404 "Ooops, that page was <b>not found</b>. Please try a different one or <a href="mailto:owner@site.com">email the site owner</a> for assistance.
ارجاع به اسکریپت
گاهاً تمایل به استفاده از اسکریپتهای Dynamic جهت نمایش صفحات خطا دارید. مثلا قصد دارید صفحهای زیبا با کارایی بالا با استفاده از فایلهای PHP بسازید و یا به جای نمایش خطای پیشفرض وبسرور، مورد خاصی را از طریق اسکریپتهای مختلف به اجرا درآورید. در این صورت میتوانید مورد زیر را انجام دهید.
1- وارد فایل .htaccess شوید.
2- کد زیر را درون آن قرار دهید:
# htaccess custom error scripts ErrorDocument 400 /errors/redirection.php ErrorDocument 401 /errors/authentication.php ErrorDocument 403 /errors/explanation.php ErrorDocument 404 /cgi-bin/not_found.pl ErrorDocument 500 /cgi-bin/server_error.pl
علاوه بر استفاده از اسکریپتهای PHP در کدهای فوق، برای خطاهای 404 و 500 در دو خط پایانی از اسکریپت Perl استفاده شده است. توجه فرمایید که جهت استفاده از زبانی به غیر از PHP، ابتدا لازم است مطمئن سرور میزبانی وبسایت شما از آن زبان و اسکریپت پشتیبانی میکند.
ارجاع به وبسایتی دیگر
صفحات خطا حتماً لازم نیست که در سرور میزبانی فعلی واقع شده باشند. گاهی قصد نمایش صفحات خطا از طریق وبسایت دیگری با آدرس اینترنتی یا همان URL مجزا دارید. در این صورت موارد زیر را انجام دهید.
1- وارد فایل .htaccess شوید.
در صورت عدم اطلاع از مسیر قرارگیری این فایل، این مقاله را مطالعه فرمایید.
2- کد زیر را درون این فایل قرار دهید:
# htaccess custom error redirects ErrorDocument 400 http://domain.tld/400_information.html ErrorDocument 401 http://domain.tld/401_information.html ErrorDocument 403 http://domain.tld/403_information.html ErrorDocument 404 http://domain.tld/404_information.html ErrorDocument 500 http://domain.tld/500_information.html
در کدهای فوق لازم است به جای عبارت «domain.tld»، آدرس دامنهی مورد نظر و به جای آدرس پس از آن، آدرس مربوط به صفحهی خطا را در سرور مقصد وارد کنید.