در این مقاله قصد داریم درباره  HTTP Header ها صحبت کنیم .
پروتکل HTTP یا همان (Hyper Text Transfer Protocol) پروتکلی است که برای ارسال و دریافت دیتا میان کلاینت و سرور ، استفاده می شود . ارتباط میان سرور و کلاینت در پروتکل HTTP به وسیله HEADER ها کنترل می شود .
HttpHeader ها در واقع اطلاعاتی هستند که هنگام ارسال request از کلاینت به سرور ، میان سرور و کلاینت ، از طریق header ها ارسال می شوند . این اطلاعات می تواند شامل نامحدودی از اطلاعات باشد که به وسیله : از یکدیگر به عنوان key,value جدا می شوند .

زمانی که شما از طریق address bar مرورگر خود یک آدرس اینترنتی را باز می کنید ، یک درخواست HTTP مانند زیر به سرور ارسال می شود.

GET /tutorialpro/what_is_http_headers/ HTTP/1.1
Host: net.tutorialpro.ir
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120
Pragma: no-cache
Cache-Control: no-cache​


این اطلاعات شامل اطلاعات پایه ای درخواست است .
خط اول که شامل GET /tutorialpro/what_is_http_headers/ HTTP/1.1 است ، نوع متد ارسالی ، صفحه وب درخواستی و نوع پروتکل ارسالی را مشخص می کند .
Host: xxx.xxx.x تعیین کننده هاست  و آدرس مقصد است .
User-Agent نوع و ورژن مرورگر و نام سیستم عامل را برای سرور ارسال می کند .
Accept-Language لیست char set هایی که مرورگر یا سرویس گیرنده قادر به پشتیبانی و پردازش آنان است ، اعلام می گردد .
در هدر Accept سرويس گيرنده به سرويس دهنده وب ،  فرمت  اطلاعاتی را كه می تواند دريافت نمايد ، اعلام می نمايد .
Accept-Encoding ، در این هدر مرورگر یک درخواست ارسال می‌کند تا بررسی کند آیا سرور فشرده سازی gzip را پشتیبانی می کند یا خیر ، اگر درخواست از سمت سرور مثبت شناسایی شد ، سرور فایل‌های فشرده شده را به سمت مرورگر ارسال می‌کند که این امر می تواند تا 70 درصد در سرعت بارگذاری صفحات وب تاثیر مثبت داشته باشد .
Keep-Alive  به  سرويس دهنده وب مدت زمان نگهداری سشن را اعلام می کند که در این مورد 300 ثانیه است . 
Cookie کوکی ها و مقادیر مختلف آن ها را اعلام می کنند ، کوکی ها اطلاعاتی هستند که در بازه زمانی خاصی ، بر روی مروگر ذخیره می شوند .
Cache-Control برای مدیریت کش کردن اطلاعات استفاده می شود .

بعد از این درخواست، مرورگر شما پاسخ HTTP یا HttpReponse دریافت می کند که ممکن است چنین  باشد:

HTTP/1.x 200 OK
Transfer-Encoding: chunked
Date: Sat, 28 Nov 2009 04:36:25 GMT
Server: LiteSpeed
Connection: close
X-Powered-By: W3 Total Cache/0.8
Pragma: public
Expires: Sat, 28 Nov 2009 05:36:25 GMT
Etag: "pub1259380237;gz"
Cache-Control: max-age=3600, public
Content-Type: text/html; charset=UTF-8
Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT
X-Pingback: http://net.tutorialpro.ir/xmlrpc.php
Content-Encoding: gzip
Vary: Accept-Encoding, Cookie, User-Agent
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>what_is_http_request</title>
<!-- ... rest of the html ... -->
خط اول نتیجه درخواست HTTP است که با کد 200 به نشانه عدم اشکال و موفقیت در ، درخواست پاسخ ، دریافت شده است . بعد از آن اطلاعاتی راجع به نوع سرور ، فرمت داده های ارسال به کلاینت و در گام آخر هم خروجی HTML به کلاینت ارسال شده است .

این درخواست ها برای دریافت فایلهای جاواسکریپت ، css ، عکس ها و... نیز در بارگذاری صفحات وب نیز ارسال می شوند و ممکن است برای مشاهده یک صفحه وب ، بیش از 30 درخواست HTTP از سمت مرورگر به سمت سرور ارسال شود .


- متدهای HTTP :
عموما درخواست های HTTP متدهای PUT,DELETE,GET, POST و HEAD را پشتیبانی می کنند .

متد GET : این متد برای دریافت و بازیابی صفحات وب ، لود کردن تصاویر ، فایلهای جاواسکریپت ، فایل های css و... استفاده می شود .
برای مثال زمانی که شما وارد آدرس article/what_is_http_request می شوید ، خط اول درخواست HTTP به این صورت می باشد .
برای استفاده از متد GET در فرم HTML نیز به صورت زیر عمل کرد .
<form method="GET" action="user_activation.php">
 
 <input type="text" name="user_id" > <br>
 <input type="text" name="activation_code" > <br>
 
<button>Send</button>

</form>​


هنگامی که این فرم را submit می کنیم ، اطلاعات ارسالی به صورت زیر می باشد .

GET /user_activation.php?user_id=12&activation_code=1123456 HTTP/1.1​

-متد POST : این متد برای ارسال اطلاعات به سمت سرور استفاده می شود ، اگرچه از طریق متد GET هم می شود این کار را انجام داد ، اما به دلیل محدودیتهای متد GET  در ارسال دیتا ، از متد POST خصوصا در فرم های HTML استفاده می شود . خصوصا هنگام آپلود فایل فقط از این متد استفاده می شود .
- متد PUT برای ویرایش دیتا در سمت سرور استفاده می شود .
- متد DELETE برای حذف دیتا در سمت سرور استفاده می شود .
اگر فرم HTML بالا را با متد POST ارسال کنیم ، درخواست HTTP ما به شکل زیر می باشد .
POST /user_activation.php HTTP/1.1
Host: tutorialpro.ir
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://tutorialpro.ir/referer.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 43
 
user_id=12&activation_code=1123456 ​

در ارسال با متد POST  و مشاهده هدر های ارسالی می توان به 3 تفاوت مهم متد POST  و GET پی برد .
1 - در خط اول HEADER , مسیر user_activation.php است و هیچ دیتا و یا query string به آن پاس داده نشده است .
2- هدرهای Content-Type و Content-Lenght به مجموعه HEADER های ارسالی اضافه شدند .
3 - دیتا ها در گام آخر و بعد از تمامی HEADER ها و به صورت query string ارسال شدند .

-متد HEAD : این متد در سطح وب استفاده چندانی ندارد ، وقتی درخواست HEAD را ارسال می کنید، به این معنی است که شما فقط به کد پاسخ و هدرهای HTTP نیاز دارید ، نه به خود سند .

کدهای وضعیت HTTP یا HTTP Status Codes :
این کدها در پاسخ به درخواست های HTTP  ارسال می شوند که هر کدام معنای خاص خود را دارد .
200 - برای درخواست های موفقیت آمیز استفاده می شود.
300 - برای تغییر مسیر ها استفاده می شود.
400 - اگر در درخواست با مشکل مواجه شد، 400 مورد استفاده قرار می گیرد.
500- اگر یک مشکل در سمت سرور وجود داشته باشد،  کد 500 مورد استفاده می شود.
404 - زمانی که صفحه وب یا فایل درخواست شده در سرور وجود نداشته باشد این کد ارسال می شود .
401 Unauthorized - این کد برای صفحاتی و منابعی  است که نیاز به احراز هویت دارند و هنگامی که پسورد و یوزر نیم غلط سمت سرور ارسال شود این کد ارسال می شود .
403 Forbidden - این کد زمانی بازگردانده می شود که درخواست کنند اجازه مشاهده و یا استفاده از صفحه وب ، فایل و.. را ندارد .
302 - 301 ، ریدایرکت کردن به یک صفحه دیگر ، اگر وب سایت شما به علت ویرایش یا بهینه سازی ، down باشد می توانید کاربران خود را به یک صفحه دیگر ریدایرکت کرده و با استفاده از کد 301 و 302 می توانید به موتورهای جستجو اعلام کنید که صفحه شما به یک پیج دیگر ریدایرکت می شود .

HTTP - Caching

کش HTTP یکی از استانداردهای HTTP و پیاده سازی های استاندارد RFC 5861  است که در همه مرورگرهای مدرن مورد استفاده قرار می گیرد و اجرای آن در برنامه های وب ساده است. استفاده مناسب از این استانداردها می تواند برنامه شما را تا حد زیادی بهبود بخشد، و همچنین در بهبود زمان پاسخ و کاهش بار سرور تاثیر بسیار مثبتی دارد .
مرورگر می تواند منابع صفحات وب را ذخیره کند تا در مراجعه بعدی به آن آدرس ، صفحات وب با سرعت بیشتری لود شوند و request های کمتر ارسال شود .
هنگامی که یک آیتم به طور کامل کش می شود، مرورگر ممکن است انتخاب کند که به هیچ وجه با سرور ارتباط برقرار نکند و به سادگی از کپی ذخیره شده خود استفاده کند .
به عنوان مثال مرورگر زمانی که یک صفحه وب را بارگذاری می کند ، فایل های css,javascript تصاویر و ... آن صفحه را کش می کند تا در request های بعدی نیازی به لود مجدد آن فایلها نباشد و تمامی آنها را از حافظه کش خود لود می کند .
در بحث HTTP - Caching دو cache header مهم به نام Cache-Control و Expires وجود دارد . 
به طور کلی ، یک CacheHeader می تواند به صورت زیر باشد .

Cache-Control: public, max-age=31536000


هدر Cache-Control مشخص می کند که قابلیت caching آیا در مرورگر فعال است یا خیر ، اگر این قابلیت در مرورگر غیرفعال باشد مرورگر در هر درخواست ، تمامی منابع صفحات وب را از سمت سرور لود می کند . این header دارای مقادیری می باشد که هر یک بیانگر موارد زیر می باشد .

Cache-Control:private اجازه می دهد تمام یا بخشی از پیام پاسخ برای یک کاربر در نظر گرفته شده است و پاسخ نباید توسط یک کش مشترک، مانند یک سرور پروکسی، کش شود.
Cache-Control:public اجازه می دهد response توسط تمامی کاربر ها و حتی پراکسی ها ، کش شود .
Cache-Control:no-cache ، قبل از استفاده از کش های کپی شده ، اجبارا که request به سمت سرور ارسال می کند تا از valid بودن کش های کپی شده مطمئن شود.
زمان بندی های cache :
Cache-Control: max-age=533280: مدت زمانی که اطلاعات یک منبع میتواند valid باشد .
Cache-Control: Expires: Sun, 03 May 2015 23:02:37 GMT : این هدر نیز تاریخ منقضی شدن کش را بیان می کند که مقدار آن یک timestamp می باشد و عموما در مرورگر های قدیمی تر استفاده می شود .

HTTP Header های بیشتری نیز وجود دارد ، اما در این مقاله سعی شد به مهم ترین آنها اشاره شود.