65 lines
103 KiB
HTML
65 lines
103 KiB
HTML
<!DOCTYPE html><html><head><meta charSet="UTF-8"/><title>HTTP Caching</title><meta name="description" content="Everything you need to know about web caching"/><meta name="author" content="Kamran Ahmed"/><meta name="keywords" content="roadmap,developer roadmaps,developer roadmap,frontend developer,frontend developer roadmap,frontend,frontend roadmap,backend,backend developer,backend developer roadmap,devops,devops roadmap,fullstack developer roadmap,guide to becoming a developer,sre roadmap,sre,operations roadmap,qa roadmap,android roadmap,android developer roadmap,react roadmap,react developer roadmap,dba roadmap,postgresql dba roadmap"/><meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1.0, maximum-scale=3.0, minimum-scale=1.0"/><meta http-equiv="Content-Language" content="en"/><meta property="og:title" content="HTTP Caching"/><meta property="og:description" content="Everything you need to know about web caching"/><meta property="og:image" content="https://roadmap.sh/brand-square.png"/><meta property="og:url" content="https://roadmap.sh"/><meta property="og:type" content="website"/><meta property="article:publisher" content="https://facebook.com/kamranahmedse"/><meta property="og:site_name" content="roadmap.sh"/><meta property="article:author" content="Kamran Ahmed"/><meta name="twitter:card" content="summary"/><meta name="twitter:site" content="@kamranahmedse"/><meta name="twitter:title" content="HTTP Caching"/><meta name="twitter:description" content="Everything you need to know about web caching"/><meta name="twitter:image" content="https://roadmap.sh/brand-square.png"/><meta name="twitter:image:alt" content="roadmap.sh"/><meta name="mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/><link rel="apple-touch-icon" sizes="180x180" href="/manifest/apple-touch-icon.png"/><meta name="msapplication-TileColor" content="#101010"/><meta name="theme-color" content="#848a9a"/><link rel="manifest" href="/manifest/manifest.json"/><link rel="icon" type="image/png" sizes="32x32" href="/manifest/icon32.png"/><link rel="icon" type="image/png" sizes="16x16" href="/manifest/icon16.png"/><link rel="shortcut icon" href="/manifest/favicon.ico" type="image/x-icon"/><link rel="icon" href="/manifest/favicon.ico" type="image/x-icon"/><script async="" src="https://www.googletagmanager.com/gtag/js?id=UA-139582634-1"></script><script>
|
||
window.dataLayer = window.dataLayer || [];
|
||
function gtag(){dataLayer.push(arguments);}
|
||
gtag('js', new Date());
|
||
gtag('config', 'UA-139582634-1');
|
||
</script><meta name="next-head-count" content="34"/><link rel="preload" href="/_next/static/css/9630938f8579f20e.css" as="style"/><link rel="stylesheet" href="/_next/static/css/9630938f8579f20e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-5cd94c89d3acac5f.js"></script><script src="/_next/static/chunks/webpack-378e68e29c265886.js" defer=""></script><script src="/_next/static/chunks/framework-dc33c0b5493501f0.js" defer=""></script><script src="/_next/static/chunks/main-056d531d8af152ad.js" defer=""></script><script src="/_next/static/chunks/pages/_app-981db2c906b1d6be.js" defer=""></script><script src="/_next/static/chunks/680-f2ef73bf59f135ea.js" defer=""></script><script src="/_next/static/chunks/22-14757297dd54265a.js" defer=""></script><script src="/_next/static/chunks/515-79757bf997a2c9cf.js" defer=""></script><script src="/_next/static/chunks/13-b259223214a65539.js" defer=""></script><script src="/_next/static/chunks/pages/guides/%5Bguide%5D-522b73f8763bfcbb.js" defer=""></script><script src="/_next/static/ooSnr_WJpF8nzY9n_DSAx/_buildManifest.js" defer=""></script><script src="/_next/static/ooSnr_WJpF8nzY9n_DSAx/_ssgManifest.js" defer=""></script><script src="/_next/static/ooSnr_WJpF8nzY9n_DSAx/_middlewareManifest.js" defer=""></script><style data-styled="" data-styled-version="5.3.3">.kiIUjN{line-height:27px;font-size:16px;color:black;margin-bottom:18px;}/*!sc*/
|
||
data-styled.g1[id="sc-bdvvtL"]{content:"kiIUjN,"}/*!sc*/
|
||
.dKUOdJ{position:relative;font-size:32px;line-height:40px;font-weight:700;margin:20px 0 10px !important;}/*!sc*/
|
||
.dKUOdJ:hover .sc-gsDKAQ{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/
|
||
data-styled.g3[id="sc-dkPtRN"]{content:"dKUOdJ,"}/*!sc*/
|
||
.cabxUq{margin:22px 0 8px;font-size:28px;}/*!sc*/
|
||
data-styled.g5[id="sc-eCImPb"]{content:"cabxUq,"}/*!sc*/
|
||
.gRXaYU{margin:18px 0 8px;font-size:24px;}/*!sc*/
|
||
data-styled.g6[id="sc-jRQBWg"]{content:"gRXaYU,"}/*!sc*/
|
||
.dZmLzd{margin:14px 0 8px;font-size:18px;}/*!sc*/
|
||
data-styled.g7[id="sc-gKclnd"]{content:"dZmLzd,"}/*!sc*/
|
||
.jiGIaj{margin:25px -25px 25px -25px !important;padding:20px 25px !important;border-radius:10px;line-height:1.5 !important;}/*!sc*/
|
||
.jiGIaj code{background:transparent;}/*!sc*/
|
||
data-styled.g9[id="sc-furwcr"]{content:"jiGIaj,"}/*!sc*/
|
||
.cuyQdk{padding:16px 20px;position:relative;background:#e8e8e8;border-radius:5px;margin-bottom:18px;}/*!sc*/
|
||
.cuyQdk h1,.cuyQdk h2,.cuyQdk h3,.cuyQdk h4,.cuyQdk h5,.cuyQdk h6{margin-top:0;}/*!sc*/
|
||
.cuyQdk p + h4{margin-top:15px;}/*!sc*/
|
||
.cuyQdk p{margin:0;}/*!sc*/
|
||
.cuyQdk p + p{margin-top:10px;}/*!sc*/
|
||
data-styled.g10[id="sc-pVTFL"]{content:"cuyQdk,"}/*!sc*/
|
||
.bIxQHp{max-width:100%;margin:25px auto;display:block;}/*!sc*/
|
||
data-styled.g13[id="sc-iqseJM"]{content:"bIxQHp,"}/*!sc*/
|
||
.gJMBjK{font-weight:600;-webkit-text-decoration:underline;text-decoration:underline;}/*!sc*/
|
||
data-styled.g14[id="sc-crHmcD"]{content:"gJMBjK,"}/*!sc*/
|
||
.gfrORe{margin-left:40px;margin-bottom:18px;}/*!sc*/
|
||
.gfrORe ul{margin-top:18px;}/*!sc*/
|
||
data-styled.g15[id="sc-egiyK"]{content:"gfrORe,"}/*!sc*/
|
||
.xTMXv{margin-bottom:7px;}/*!sc*/
|
||
data-styled.g16[id="sc-bqiRlB"]{content:"xTMXv,"}/*!sc*/
|
||
</style></head><body><div id="__next" data-reactroot=""><style data-emotion="css-global brzcv3">:host,:root{--chakra-ring-inset:var(--chakra-empty,/*!*/ /*!*/);--chakra-ring-offset-width:0px;--chakra-ring-offset-color:#fff;--chakra-ring-color:rgba(66, 153, 225, 0.6);--chakra-ring-offset-shadow:0 0 #0000;--chakra-ring-shadow:0 0 #0000;--chakra-space-x-reverse:0;--chakra-space-y-reverse:0;--chakra-colors-transparent:transparent;--chakra-colors-current:currentColor;--chakra-colors-black:#000000;--chakra-colors-white:#FFFFFF;--chakra-colors-whiteAlpha-50:rgba(255, 255, 255, 0.04);--chakra-colors-whiteAlpha-100:rgba(255, 255, 255, 0.06);--chakra-colors-whiteAlpha-200:rgba(255, 255, 255, 0.08);--chakra-colors-whiteAlpha-300:rgba(255, 255, 255, 0.16);--chakra-colors-whiteAlpha-400:rgba(255, 255, 255, 0.24);--chakra-colors-whiteAlpha-500:rgba(255, 255, 255, 0.36);--chakra-colors-whiteAlpha-600:rgba(255, 255, 255, 0.48);--chakra-colors-whiteAlpha-700:rgba(255, 255, 255, 0.64);--chakra-colors-whiteAlpha-800:rgba(255, 255, 255, 0.80);--chakra-colors-whiteAlpha-900:rgba(255, 255, 255, 0.92);--chakra-colors-blackAlpha-50:rgba(0, 0, 0, 0.04);--chakra-colors-blackAlpha-100:rgba(0, 0, 0, 0.06);--chakra-colors-blackAlpha-200:rgba(0, 0, 0, 0.08);--chakra-colors-blackAlpha-300:rgba(0, 0, 0, 0.16);--chakra-colors-blackAlpha-400:rgba(0, 0, 0, 0.24);--chakra-colors-blackAlpha-500:rgba(0, 0, 0, 0.36);--chakra-colors-blackAlpha-600:rgba(0, 0, 0, 0.48);--chakra-colors-blackAlpha-700:rgba(0, 0, 0, 0.64);--chakra-colors-blackAlpha-800:rgba(0, 0, 0, 0.80);--chakra-colors-blackAlpha-900:rgba(0, 0, 0, 0.92);--chakra-colors-gray-50:#F7FAFC;--chakra-colors-gray-100:#EDF2F7;--chakra-colors-gray-200:#E2E8F0;--chakra-colors-gray-300:#CBD5E0;--chakra-colors-gray-400:#A0AEC0;--chakra-colors-gray-500:#718096;--chakra-colors-gray-600:#4A5568;--chakra-colors-gray-700:#2D3748;--chakra-colors-gray-800:#1A202C;--chakra-colors-gray-900:#171923;--chakra-colors-red-50:#FFF5F5;--chakra-colors-red-100:#FED7D7;--chakra-colors-red-200:#FEB2B2;--chakra-colors-red-300:#FC8181;--chakra-colors-red-400:#F56565;--chakra-colors-red-500:#E53E3E;--chakra-colors-red-600:#C53030;--chakra-colors-red-700:#9B2C2C;--chakra-colors-red-800:#822727;--chakra-colors-red-900:#63171B;--chakra-colors-orange-50:#FFFAF0;--chakra-colors-orange-100:#FEEBC8;--chakra-colors-orange-200:#FBD38D;--chakra-colors-orange-300:#F6AD55;--chakra-colors-orange-400:#ED8936;--chakra-colors-orange-500:#DD6B20;--chakra-colors-orange-600:#C05621;--chakra-colors-orange-700:#9C4221;--chakra-colors-orange-800:#7B341E;--chakra-colors-orange-900:#652B19;--chakra-colors-yellow-50:#FFFFF0;--chakra-colors-yellow-100:#FEFCBF;--chakra-colors-yellow-200:#FAF089;--chakra-colors-yellow-300:#F6E05E;--chakra-colors-yellow-400:#ECC94B;--chakra-colors-yellow-500:#D69E2E;--chakra-colors-yellow-600:#B7791F;--chakra-colors-yellow-700:#975A16;--chakra-colors-yellow-800:#744210;--chakra-colors-yellow-900:#5F370E;--chakra-colors-green-50:#F0FFF4;--chakra-colors-green-100:#C6F6D5;--chakra-colors-green-200:#9AE6B4;--chakra-colors-green-300:#68D391;--chakra-colors-green-400:#48BB78;--chakra-colors-green-500:#38A169;--chakra-colors-green-600:#2F855A;--chakra-colors-green-700:#276749;--chakra-colors-green-800:#22543D;--chakra-colors-green-900:#1C4532;--chakra-colors-teal-50:#E6FFFA;--chakra-colors-teal-100:#B2F5EA;--chakra-colors-teal-200:#81E6D9;--chakra-colors-teal-300:#4FD1C5;--chakra-colors-teal-400:#38B2AC;--chakra-colors-teal-500:#319795;--chakra-colors-teal-600:#2C7A7B;--chakra-colors-teal-700:#285E61;--chakra-colors-teal-800:#234E52;--chakra-colors-teal-900:#1D4044;--chakra-colors-blue-50:#ebf8ff;--chakra-colors-blue-100:#bee3f8;--chakra-colors-blue-200:#90cdf4;--chakra-colors-blue-300:#63b3ed;--chakra-colors-blue-400:#4299e1;--chakra-colors-blue-500:#3182ce;--chakra-colors-blue-600:#2b6cb0;--chakra-colors-blue-700:#2c5282;--chakra-colors-blue-800:#2a4365;--chakra-colors-blue-900:#1A365D;--chakra-colors-cyan-50:#EDFDFD;--chakra-colors-cyan-100:#C4F1F9;--chakra-colors-cyan-200:#9DECF9;--chakra-colors-cyan-300:#76E4F7;--chakra-colors-cyan-400:#0BC5EA;--chakra-colors-cyan-500:#00B5D8;--chakra-colors-cyan-600:#00A3C4;--chakra-colors-cyan-700:#0987A0;--chakra-colors-cyan-800:#086F83;--chakra-colors-cyan-900:#065666;--chakra-colors-purple-50:#FAF5FF;--chakra-colors-purple-100:#E9D8FD;--chakra-colors-purple-200:#D6BCFA;--chakra-colors-purple-300:#B794F4;--chakra-colors-purple-400:#9F7AEA;--chakra-colors-purple-500:#805AD5;--chakra-colors-purple-600:#6B46C1;--chakra-colors-purple-700:#553C9A;--chakra-colors-purple-800:#44337A;--chakra-colors-purple-900:#322659;--chakra-colors-pink-50:#FFF5F7;--chakra-colors-pink-100:#FED7E2;--chakra-colors-pink-200:#FBB6CE;--chakra-colors-pink-300:#F687B3;--chakra-colors-pink-400:#ED64A6;--chakra-colors-pink-500:#D53F8C;--chakra-colors-pink-600:#B83280;--chakra-colors-pink-700:#97266D;--chakra-colors-pink-800:#702459;--chakra-colors-pink-900:#521B41;--chakra-colors-linkedin-50:#E8F4F9;--chakra-colors-linkedin-100:#CFEDFB;--chakra-colors-linkedin-200:#9BDAF3;--chakra-colors-linkedin-300:#68C7EC;--chakra-colors-linkedin-400:#34B3E4;--chakra-colors-linkedin-500:#00A0DC;--chakra-colors-linkedin-600:#008CC9;--chakra-colors-linkedin-700:#0077B5;--chakra-colors-linkedin-800:#005E93;--chakra-colors-linkedin-900:#004471;--chakra-colors-facebook-50:#E8F4F9;--chakra-colors-facebook-100:#D9DEE9;--chakra-colors-facebook-200:#B7C2DA;--chakra-colors-facebook-300:#6482C0;--chakra-colors-facebook-400:#4267B2;--chakra-colors-facebook-500:#385898;--chakra-colors-facebook-600:#314E89;--chakra-colors-facebook-700:#29487D;--chakra-colors-facebook-800:#223B67;--chakra-colors-facebook-900:#1E355B;--chakra-colors-messenger-50:#D0E6FF;--chakra-colors-messenger-100:#B9DAFF;--chakra-colors-messenger-200:#A2CDFF;--chakra-colors-messenger-300:#7AB8FF;--chakra-colors-messenger-400:#2E90FF;--chakra-colors-messenger-500:#0078FF;--chakra-colors-messenger-600:#0063D1;--chakra-colors-messenger-700:#0052AC;--chakra-colors-messenger-800:#003C7E;--chakra-colors-messenger-900:#002C5C;--chakra-colors-whatsapp-50:#dffeec;--chakra-colors-whatsapp-100:#b9f5d0;--chakra-colors-whatsapp-200:#90edb3;--chakra-colors-whatsapp-300:#65e495;--chakra-colors-whatsapp-400:#3cdd78;--chakra-colors-whatsapp-500:#22c35e;--chakra-colors-whatsapp-600:#179848;--chakra-colors-whatsapp-700:#0c6c33;--chakra-colors-whatsapp-800:#01421c;--chakra-colors-whatsapp-900:#001803;--chakra-colors-twitter-50:#E5F4FD;--chakra-colors-twitter-100:#C8E9FB;--chakra-colors-twitter-200:#A8DCFA;--chakra-colors-twitter-300:#83CDF7;--chakra-colors-twitter-400:#57BBF5;--chakra-colors-twitter-500:#1DA1F2;--chakra-colors-twitter-600:#1A94DA;--chakra-colors-twitter-700:#1681BF;--chakra-colors-twitter-800:#136B9E;--chakra-colors-twitter-900:#0D4D71;--chakra-colors-telegram-50:#E3F2F9;--chakra-colors-telegram-100:#C5E4F3;--chakra-colors-telegram-200:#A2D4EC;--chakra-colors-telegram-300:#7AC1E4;--chakra-colors-telegram-400:#47A9DA;--chakra-colors-telegram-500:#0088CC;--chakra-colors-telegram-600:#007AB8;--chakra-colors-telegram-700:#006BA1;--chakra-colors-telegram-800:#005885;--chakra-colors-telegram-900:#003F5E;--chakra-colors-brand-bg:#06020d;--chakra-colors-brand-hero:#06020d;--chakra-colors-brand-footer:#0d041e;--chakra-borders-none:0;--chakra-borders-1px:1px solid;--chakra-borders-2px:2px solid;--chakra-borders-4px:4px solid;--chakra-borders-8px:8px solid;--chakra-fonts-heading:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--chakra-fonts-body:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--chakra-fonts-mono:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--chakra-fontSizes-xs:0.75rem;--chakra-fontSizes-sm:0.875rem;--chakra-fontSizes-md:1rem;--chakra-fontSizes-lg:1.125rem;--chakra-fontSizes-xl:1.25rem;--chakra-fontSizes-2xl:1.5rem;--chakra-fontSizes-3xl:1.875rem;--chakra-fontSizes-4xl:2.25rem;--chakra-fontSizes-5xl:3rem;--chakra-fontSizes-6xl:3.75rem;--chakra-fontSizes-7xl:4.5rem;--chakra-fontSizes-8xl:6rem;--chakra-fontSizes-9xl:8rem;--chakra-fontWeights-hairline:100;--chakra-fontWeights-thin:200;--chakra-fontWeights-light:300;--chakra-fontWeights-normal:400;--chakra-fontWeights-medium:500;--chakra-fontWeights-semibold:600;--chakra-fontWeights-bold:700;--chakra-fontWeights-extrabold:800;--chakra-fontWeights-black:900;--chakra-letterSpacings-tighter:-0.05em;--chakra-letterSpacings-tight:-0.025em;--chakra-letterSpacings-normal:0;--chakra-letterSpacings-wide:0.025em;--chakra-letterSpacings-wider:0.05em;--chakra-letterSpacings-widest:0.1em;--chakra-lineHeights-3:.75rem;--chakra-lineHeights-4:1rem;--chakra-lineHeights-5:1.25rem;--chakra-lineHeights-6:1.5rem;--chakra-lineHeights-7:1.75rem;--chakra-lineHeights-8:2rem;--chakra-lineHeights-9:2.25rem;--chakra-lineHeights-10:2.5rem;--chakra-lineHeights-normal:normal;--chakra-lineHeights-none:1;--chakra-lineHeights-shorter:1.25;--chakra-lineHeights-short:1.375;--chakra-lineHeights-base:1.5;--chakra-lineHeights-tall:1.625;--chakra-lineHeights-taller:2;--chakra-radii-none:0;--chakra-radii-sm:0.125rem;--chakra-radii-base:0.25rem;--chakra-radii-md:0.375rem;--chakra-radii-lg:0.5rem;--chakra-radii-xl:0.75rem;--chakra-radii-2xl:1rem;--chakra-radii-3xl:1.5rem;--chakra-radii-full:9999px;--chakra-space-1:0.25rem;--chakra-space-2:0.5rem;--chakra-space-3:0.75rem;--chakra-space-4:1rem;--chakra-space-5:1.25rem;--chakra-space-6:1.5rem;--chakra-space-7:1.75rem;--chakra-space-8:2rem;--chakra-space-9:2.25rem;--chakra-space-10:2.5rem;--chakra-space-12:3rem;--chakra-space-14:3.5rem;--chakra-space-16:4rem;--chakra-space-20:5rem;--chakra-space-24:6rem;--chakra-space-28:7rem;--chakra-space-32:8rem;--chakra-space-36:9rem;--chakra-space-40:10rem;--chakra-space-44:11rem;--chakra-space-48:12rem;--chakra-space-52:13rem;--chakra-space-56:14rem;--chakra-space-60:15rem;--chakra-space-64:16rem;--chakra-space-72:18rem;--chakra-space-80:20rem;--chakra-space-96:24rem;--chakra-space-px:1px;--chakra-space-0\.5:0.125rem;--chakra-space-1\.5:0.375rem;--chakra-space-2\.5:0.625rem;--chakra-space-3\.5:0.875rem;--chakra-shadows-xs:0 0 0 1px rgba(0, 0, 0, 0.05);--chakra-shadows-sm:0 1px 2px 0 rgba(0, 0, 0, 0.05);--chakra-shadows-base:0 1px 3px 0 rgba(0, 0, 0, 0.1),0 1px 2px 0 rgba(0, 0, 0, 0.06);--chakra-shadows-md:0 4px 6px -1px rgba(0, 0, 0, 0.1),0 2px 4px -1px rgba(0, 0, 0, 0.06);--chakra-shadows-lg:0 10px 15px -3px rgba(0, 0, 0, 0.1),0 4px 6px -2px rgba(0, 0, 0, 0.05);--chakra-shadows-xl:0 20px 25px -5px rgba(0, 0, 0, 0.1),0 10px 10px -5px rgba(0, 0, 0, 0.04);--chakra-shadows-2xl:0 25px 50px -12px rgba(0, 0, 0, 0.25);--chakra-shadows-outline:0 0 0 3px rgba(66, 153, 225, 0.6);--chakra-shadows-inner:inset 0 2px 4px 0 rgba(0,0,0,0.06);--chakra-shadows-none:none;--chakra-shadows-dark-lg:rgba(0, 0, 0, 0.1) 0px 0px 0px 1px,rgba(0, 0, 0, 0.2) 0px 5px 10px,rgba(0, 0, 0, 0.4) 0px 15px 40px;--chakra-sizes-1:0.25rem;--chakra-sizes-2:0.5rem;--chakra-sizes-3:0.75rem;--chakra-sizes-4:1rem;--chakra-sizes-5:1.25rem;--chakra-sizes-6:1.5rem;--chakra-sizes-7:1.75rem;--chakra-sizes-8:2rem;--chakra-sizes-9:2.25rem;--chakra-sizes-10:2.5rem;--chakra-sizes-12:3rem;--chakra-sizes-14:3.5rem;--chakra-sizes-16:4rem;--chakra-sizes-20:5rem;--chakra-sizes-24:6rem;--chakra-sizes-28:7rem;--chakra-sizes-32:8rem;--chakra-sizes-36:9rem;--chakra-sizes-40:10rem;--chakra-sizes-44:11rem;--chakra-sizes-48:12rem;--chakra-sizes-52:13rem;--chakra-sizes-56:14rem;--chakra-sizes-60:15rem;--chakra-sizes-64:16rem;--chakra-sizes-72:18rem;--chakra-sizes-80:20rem;--chakra-sizes-96:24rem;--chakra-sizes-px:1px;--chakra-sizes-0\.5:0.125rem;--chakra-sizes-1\.5:0.375rem;--chakra-sizes-2\.5:0.625rem;--chakra-sizes-3\.5:0.875rem;--chakra-sizes-max:max-content;--chakra-sizes-min:min-content;--chakra-sizes-full:100%;--chakra-sizes-3xs:14rem;--chakra-sizes-2xs:16rem;--chakra-sizes-xs:20rem;--chakra-sizes-sm:24rem;--chakra-sizes-md:28rem;--chakra-sizes-lg:32rem;--chakra-sizes-xl:36rem;--chakra-sizes-2xl:42rem;--chakra-sizes-3xl:48rem;--chakra-sizes-4xl:56rem;--chakra-sizes-5xl:64rem;--chakra-sizes-6xl:72rem;--chakra-sizes-7xl:80rem;--chakra-sizes-8xl:90rem;--chakra-sizes-container-sm:640px;--chakra-sizes-container-md:768px;--chakra-sizes-container-lg:1024px;--chakra-sizes-container-xl:1280px;--chakra-zIndices-hide:-1;--chakra-zIndices-auto:auto;--chakra-zIndices-base:0;--chakra-zIndices-docked:10;--chakra-zIndices-dropdown:1000;--chakra-zIndices-sticky:1100;--chakra-zIndices-banner:1200;--chakra-zIndices-overlay:1300;--chakra-zIndices-modal:1400;--chakra-zIndices-popover:1500;--chakra-zIndices-skipLink:1600;--chakra-zIndices-toast:1700;--chakra-zIndices-tooltip:1800;--chakra-transition-property-common:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;--chakra-transition-property-colors:background-color,border-color,color,fill,stroke;--chakra-transition-property-dimensions:width,height;--chakra-transition-property-position:left,right,top,bottom;--chakra-transition-property-background:background-color,background-image,background-position;--chakra-transition-easing-ease-in:cubic-bezier(0.4, 0, 1, 1);--chakra-transition-easing-ease-out:cubic-bezier(0, 0, 0.2, 1);--chakra-transition-easing-ease-in-out:cubic-bezier(0.4, 0, 0.2, 1);--chakra-transition-duration-ultra-fast:50ms;--chakra-transition-duration-faster:100ms;--chakra-transition-duration-fast:150ms;--chakra-transition-duration-normal:200ms;--chakra-transition-duration-slow:300ms;--chakra-transition-duration-slower:400ms;--chakra-transition-duration-ultra-slow:500ms;--chakra-blur-none:0;--chakra-blur-sm:4px;--chakra-blur-base:8px;--chakra-blur-md:12px;--chakra-blur-lg:16px;--chakra-blur-xl:24px;--chakra-blur-2xl:40px;--chakra-blur-3xl:64px;}</style><style data-emotion="css-global 1jqlf9g">html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:system-ui,sans-serif;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;touch-action:manipulation;}body{position:relative;min-height:100%;font-feature-settings:'kern';}*,*::before,*::after{border-width:0;border-style:solid;box-sizing:border-box;}main{display:block;}hr{border-top-width:1px;box-sizing:content-box;height:0;overflow:visible;}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:1em;}a{background-color:transparent;color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit;}abbr[title]{border-bottom:none;-webkit-text-decoration:underline;text-decoration:underline;-webkit-text-decoration:underline dotted;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;}b,strong{font-weight:bold;}small{font-size:80%;}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}sub{bottom:-0.25em;}sup{top:-0.5em;}img{border-style:none;}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0;}button,input{overflow:visible;}button,select{text-transform:none;}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0;}fieldset{padding:0.35em 0.75em 0.625em;}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal;}progress{vertical-align:baseline;}textarea{overflow:auto;}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0;}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{-webkit-appearance:none!important;}input[type="number"]{-moz-appearance:textfield;}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px;}[type="search"]::-webkit-search-decoration{-webkit-appearance:none!important;}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit;}details{display:block;}summary{display:-webkit-box;display:-webkit-list-item;display:-ms-list-itembox;display:list-item;}template{display:none;}[hidden]{display:none!important;}body,blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0;}button{background:transparent;padding:0;}fieldset{margin:0;padding:0;}ol,ul{margin:0;padding:0;}textarea{resize:vertical;}button,[role="button"]{cursor:pointer;}button::-moz-focus-inner{border:0!important;}table{border-collapse:collapse;}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit;}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit;}img,svg,video,canvas,audio,iframe,embed,object{display:block;}img,video{max-width:100%;height:auto;}[data-js-focus-visible] :focus:not([data-focus-visible-added]){outline:none;box-shadow:none;}select::-ms-expand{display:none;}</style><style data-emotion="css-global 1baqkrf">body{font-family:var(--chakra-fonts-body);color:var(--chakra-colors-gray-800);background:var(--chakra-colors-white);transition-property:background-color;transition-duration:var(--chakra-transition-duration-normal);line-height:var(--chakra-lineHeights-base);}*::-webkit-input-placeholder{color:var(--chakra-colors-gray-400);}*::-moz-placeholder{color:var(--chakra-colors-gray-400);}*:-ms-input-placeholder{color:var(--chakra-colors-gray-400);}*::placeholder{color:var(--chakra-colors-gray-400);}*,*::before,::after{border-color:var(--chakra-colors-gray-200);word-wrap:break-word;}</style><style data-emotion="css-global 1v09d1a">.js-focus-visible :focus:not([data-focus-visible-added]){outline:none;box-shadow:none;}svg text tspan{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeSpeed;}code{background:#1e1e3f;color:#9efeff;padding:3px 5px;font-size:14px;border-radius:3px;}svg .clickable-group{cursor:pointer;}svg .clickable-group:hover>[fill="rgb(65,53,214)"]{fill:#232381;stroke:#232381;}svg .clickable-group:hover>[fill="rgb(255,255,0)"]{fill:#d6d700;}svg .clickable-group:hover>[fill="rgb(255,229,153)"]{fill:#f3c950;}svg .clickable-group:hover>[fill="rgb(153,153,153)"]{fill:#646464;}svg .clickable-group:hover>[fill="rgb(255,255,255)"]{fill:#d7d7d7;}svg .done rect{fill:#cbcbcb!important;}svg .done text{-webkit-text-decoration:line-through;text-decoration:line-through;}</style><style data-emotion="css gk6shj">.css-gk6shj{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;background:var(--chakra-colors-yellow-200);color:var(--chakra-colors-gray-900);position:-webkit-sticky;position:sticky;top:0px;z-index:999;padding-top:8px;padding-bottom:8px;}.css-gk6shj:hover,.css-gk6shj[data-hover]{-webkit-text-decoration:none;text-decoration:none;background:var(--chakra-colors-yellow-400);}</style><style data-emotion="css n1ed3e">.css-n1ed3e{transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-fast);transition-timing-function:var(--chakra-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:none;text-decoration:none;outline:2px solid transparent;outline-offset:2px;color:inherit;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;background:var(--chakra-colors-yellow-200);color:var(--chakra-colors-gray-900);position:-webkit-sticky;position:sticky;top:0px;z-index:999;padding-top:8px;padding-bottom:8px;}.css-n1ed3e:hover,.css-n1ed3e[data-hover]{-webkit-text-decoration:underline;text-decoration:underline;}.css-n1ed3e:focus,.css-n1ed3e[data-focus]{box-shadow:var(--chakra-shadows-outline);}.css-n1ed3e:hover,.css-n1ed3e[data-hover]{-webkit-text-decoration:none;text-decoration:none;background:var(--chakra-colors-yellow-400);}</style><a target="_blank" class="chakra-link css-n1ed3e" href="https://youtube.com/theroadmap?sub_confirmation=1"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="currentColor" style="height:20px;display:inline-block;margin-right:7px"><path d="M19.615 3.184c-3.604-.246-11.631-.245-15.23 0C.488 3.45.029 5.804 0 12c.029 6.185.484 8.549 4.385 8.816 3.6.245 11.626.246 15.23 0C23.512 20.55 23.971 18.196 24 12c-.029-6.185-.484-8.549-4.385-8.816zM9 16V8l8 3.993L9 16z"></path></svg><style data-emotion="css 17vuvug">.css-17vuvug{font-weight:500;font-size:14px;}</style><span class="chakra-text css-17vuvug"><span class="chakra-text css-0">We now have a YouTube Channel. <style data-emotion="css 13wfqy8">.css-13wfqy8{display:none;}@media screen and (min-width: 30em){.css-13wfqy8{display:inline;}}</style><span class="chakra-text css-13wfqy8">Subscribe for the video content.</span></span></span></a><style data-emotion="css 123acky">.css-123acky{background:var(--chakra-colors-white);min-height:100vh;}</style><div class="css-123acky"><style data-emotion="css sttgv9">.css-sttgv9{background:var(--chakra-colors-gray-900);padding:20px 0;}</style><div class="css-sttgv9"><style data-emotion="css nm5t63">.css-nm5t63{width:100%;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;max-width:var(--chakra-sizes-container-md);-webkit-padding-start:1rem;padding-inline-start:1rem;-webkit-padding-end:1rem;padding-inline-end:1rem;}</style><div class="chakra-container css-nm5t63"><style data-emotion="css 1lekzkb">.css-1lekzkb{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;}</style><div class="css-1lekzkb"><div class="css-0"><style data-emotion="css 140fodl">.css-140fodl{transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-fast);transition-timing-function:var(--chakra-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:none;text-decoration:none;outline:2px solid transparent;outline-offset:2px;color:var(--chakra-colors-white);width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-weight:600;font-size:18px;}.css-140fodl:hover,.css-140fodl[data-hover]{-webkit-text-decoration:none;text-decoration:none;}.css-140fodl:focus,.css-140fodl[data-focus]{box-shadow:var(--chakra-shadows-outline);}</style><a class="chakra-link css-140fodl" href="/"><svg width="30" height="30" viewBox="0 0 283 283" fill="none" xmlns="http://www.w3.org/2000/svg" style="height:30px;width:30px;margin-right:10px"><path d="M0 39C0 17.46 17.46 0 39 0h205c21.539 0 39 17.46 39 39v205c0 21.539-17.461 39-39 39H39c-21.54 0-39-17.461-39-39V39Z" fill="#000"></path><path d="M121.215 210.72c-1.867.56-4.854 1.12-8.96 1.68-3.92.56-8.027.84-12.32.84-4.107 0-7.84-.28-11.2-.84-3.174-.56-5.88-1.68-8.12-3.36-2.24-1.68-4.014-3.92-5.32-6.72-1.12-2.987-1.68-6.813-1.68-11.48v-84c0-4.293.746-7.933 2.24-10.92 1.68-3.173 4.013-5.973 7-8.4 2.986-2.427 6.626-4.573 10.92-6.44 4.48-2.053 9.24-3.827 14.28-5.32a106.176 106.176 0 0 1 15.68-3.36 95.412 95.412 0 0 1 16.24-1.4c8.96 0 16.053 1.773 21.28 5.32 5.226 3.36 7.84 8.96 7.84 16.8 0 2.613-.374 5.227-1.12 7.84-.747 2.427-1.68 4.667-2.8 6.72-3.92 0-7.934.187-12.04.56-4.107.373-8.12.933-12.04 1.68-3.92.747-7.654 1.587-11.2 2.52-3.36.747-6.254 1.68-8.68 2.8v95.48Zm45.172-22.4c0-7.84 2.426-14.373 7.28-19.6 4.853-5.227 11.48-7.84 19.88-7.84 8.4 0 15.026 2.613 19.88 7.84 4.853 5.227 7.28 11.76 7.28 19.6 0 7.84-2.427 14.373-7.28 19.6-4.854 5.227-11.48 7.84-19.88 7.84-8.4 0-15.027-2.613-19.88-7.84-4.854-5.227-7.28-11.76-7.28-19.6Z" fill="#fff"></path></svg><style data-emotion="css 1youuz0">.css-1youuz0{display:block;}@media screen and (min-width: 30em){.css-1youuz0{display:none;}}@media screen and (min-width: 48em){.css-1youuz0{display:block;}}</style><span class="chakra-text css-1youuz0">roadmap.sh</span></a></div><style data-emotion="css 1w38872">.css-1w38872{display:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;color:var(--chakra-colors-gray-50);font-size:15px;}.css-1w38872>*:not(style)~*:not(style){margin-top:0px;-webkit-margin-end:0px;margin-inline-end:0px;margin-bottom:0px;-webkit-margin-start:15px;margin-inline-start:15px;}@media screen and (min-width: 30em){.css-1w38872{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}@media screen and (min-width: 48em){.css-1w38872{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}</style><div class="chakra-stack css-1w38872"><style data-emotion="css 1qy82gu">.css-1qy82gu{display:inline-block;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-width:0px;}</style><div class="chakra-stack__item css-1qy82gu"><style data-emotion="css lstwx6">.css-lstwx6{transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-fast);transition-timing-function:var(--chakra-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:none;text-decoration:none;outline:2px solid transparent;outline-offset:2px;color:inherit;border-bottom-width:0;border-bottom-color:var(--chakra-colors-gray-500);font-weight:500;}.css-lstwx6:hover,.css-lstwx6[data-hover]{-webkit-text-decoration:none;text-decoration:none;border-bottom-color:var(--chakra-colors-white);}.css-lstwx6:focus,.css-lstwx6[data-focus]{box-shadow:var(--chakra-shadows-outline);}</style><a class="chakra-link css-lstwx6" href="/roadmaps">Roadmaps</a></div><div class="chakra-stack__item css-1qy82gu"><a class="chakra-link css-lstwx6" href="/guides">Guides</a></div><div class="chakra-stack__item css-1qy82gu"><a class="chakra-link css-lstwx6" href="/watch">Videos</a></div><div class="chakra-stack__item css-1qy82gu"><a class="chakra-link css-lstwx6" href="/thanks">Thanks</a></div><div class="chakra-stack__item css-1qy82gu"><style data-emotion="css t88ydv">.css-t88ydv{transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-fast);transition-timing-function:var(--chakra-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:none;text-decoration:none;outline:2px solid transparent;outline-offset:2px;color:inherit;margin-left:10px;background-image:linear-gradient(to left, var(--chakra-colors-yellow-700), var(--chakra-colors-red-600));padding:7px 10px;border-radius:4px;font-weight:500;}.css-t88ydv:hover,.css-t88ydv[data-hover]{-webkit-text-decoration:none;text-decoration:none;background-image:linear-gradient(to left, var(--chakra-colors-red-800), var(--chakra-colors-yellow-700));}.css-t88ydv:focus,.css-t88ydv[data-focus]{box-shadow:var(--chakra-shadows-outline);}</style><a class="chakra-link css-t88ydv" href="/signup">Subscribe</a></div></div><style data-emotion="css lpr56g">.css-lpr56g{display:block;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;white-space:nowrap;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;width:auto;line-height:1.2;border-radius:5px;font-weight:var(--chakra-fontWeights-semibold);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);height:auto;min-width:var(--chakra-sizes-10);font-size:var(--chakra-fontSizes-md);-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);background:var(--chakra-colors-transparent);padding:0px;color:var(--chakra-colors-white);cursor:pointer;}.css-lpr56g:focus,.css-lpr56g[data-focus]{background:var(--chakra-colors-transparent);}.css-lpr56g[disabled],.css-lpr56g[aria-disabled=true],.css-lpr56g[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-lpr56g:hover,.css-lpr56g[data-hover]{background:var(--chakra-colors-transparent);}.css-lpr56g:active,.css-lpr56g[data-active]{background:var(--chakra-colors-transparent);}@media screen and (min-width: 30em){.css-lpr56g{display:none;}}@media screen and (min-width: 48em){.css-lpr56g{display:none;}}</style><button type="button" class="chakra-button css-lpr56g" aria-label="Menu"><style data-emotion="css 17elikm">.css-17elikm{width:25px;height:25px;display:inline-block;line-height:1em;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;color:var(--chakra-colors-white);vertical-align:middle;}</style><svg viewBox="0 0 24 24" focusable="false" class="chakra-icon css-17elikm" aria-hidden="true"><path fill="currentColor" d="M 3 5 A 1.0001 1.0001 0 1 0 3 7 L 21 7 A 1.0001 1.0001 0 1 0 21 5 L 3 5 z M 3 11 A 1.0001 1.0001 0 1 0 3 13 L 21 13 A 1.0001 1.0001 0 1 0 21 11 L 3 11 z M 3 17 A 1.0001 1.0001 0 1 0 3 19 L 21 19 A 1.0001 1.0001 0 1 0 21 17 L 3 17 z"></path></svg></button></div></div></div><style data-emotion="css flpniz">.css-flpniz{margin-bottom:60px;}</style><div class="css-flpniz"><style data-emotion="css 1yls08e">.css-1yls08e{padding-top:35px;padding-bottom:35px;border-bottom-width:1px;margin-bottom:30px;}@media screen and (min-width: 30em){.css-1yls08e{padding-top:35px;padding-bottom:35px;}}@media screen and (min-width: 48em){.css-1yls08e{padding-top:70px;padding-bottom:55px;}}</style><div class="css-1yls08e"><style data-emotion="css 3iv5ap">.css-3iv5ap{width:100%;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;max-width:var(--chakra-sizes-container-md);-webkit-padding-start:1rem;padding-inline-start:1rem;-webkit-padding-end:1rem;padding-inline-end:1rem;position:relative;text-align:left;}@media screen and (min-width: 30em){.css-3iv5ap{text-align:left;}}@media screen and (min-width: 48em){.css-3iv5ap{text-align:center;}}</style><div class="chakra-container css-3iv5ap"><style data-emotion="css 1s6l7oz">.css-1s6l7oz{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;font-size:12px;}@media screen and (min-width: 30em){.css-1s6l7oz{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;font-size:12px;}}@media screen and (min-width: 48em){.css-1s6l7oz{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;font-size:14px;}}</style><div class="css-1s6l7oz"><style data-emotion="css tomzwu">.css-tomzwu{transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-fast);transition-timing-function:var(--chakra-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:none;text-decoration:none;outline:2px solid transparent;outline-offset:2px;color:var(--chakra-colors-gray-500);display:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-weight:600;}.css-tomzwu:hover,.css-tomzwu[data-hover]{-webkit-text-decoration:underline;text-decoration:underline;}.css-tomzwu:focus,.css-tomzwu[data-focus]{box-shadow:var(--chakra-shadows-outline);}@media screen and (min-width: 30em){.css-tomzwu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}@media screen and (min-width: 48em){.css-tomzwu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}</style><a target="_blank" class="chakra-link css-tomzwu" href="https://twitter.com/kamranahmedse"><style data-emotion="css 1bgbs7z">.css-1bgbs7z{border-radius:var(--chakra-radii-full);margin-right:7px;width:22px;}</style><img alt="" src="/authors/kamranahmedse.jpeg" class="chakra-image css-1bgbs7z"/>Kamran Ahmed</a><style data-emotion="css 16hbmpr">.css-16hbmpr{display:none;-webkit-margin-start:7px;margin-inline-start:7px;-webkit-margin-end:7px;margin-inline-end:7px;color:var(--chakra-colors-gray-500);}@media screen and (min-width: 30em){.css-16hbmpr{display:inline;}}@media screen and (min-width: 48em){.css-16hbmpr{display:inline;}}</style><span class="chakra-text css-16hbmpr">·</span><style data-emotion="css q9k0mw">.css-q9k0mw{color:var(--chakra-colors-gray-500);}</style><span class="chakra-text css-q9k0mw">November 29, 2018</span><style data-emotion="css hdjuk6">.css-hdjuk6{display:none;-webkit-margin-start:7px;margin-inline-start:7px;-webkit-margin-end:7px;margin-inline-end:7px;color:var(--chakra-colors-gray-500);}@media screen and (min-width: 30em){.css-hdjuk6{display:none;}}@media screen and (min-width: 48em){.css-hdjuk6{display:inline;}}</style><span class="chakra-text css-hdjuk6">·</span><style data-emotion="css 44g9xm">.css-44g9xm{transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-fast);transition-timing-function:var(--chakra-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:none;text-decoration:none;outline:2px solid transparent;outline-offset:2px;color:var(--chakra-colors-blue-500);display:none;font-weight:500;}.css-44g9xm:hover,.css-44g9xm[data-hover]{-webkit-text-decoration:underline;text-decoration:underline;}.css-44g9xm:focus,.css-44g9xm[data-focus]{box-shadow:var(--chakra-shadows-outline);}@media screen and (min-width: 30em){.css-44g9xm{display:none;}}@media screen and (min-width: 48em){.css-44g9xm{display:inline;}}</style><a target="_blank" class="chakra-link css-44g9xm" href="https://github.com/kamranahmedse/developer-roadmap/tree/master/content/guides/http-caching.md">Improve this Guide</a></div><style data-emotion="css 114bhkb">.css-114bhkb{font-family:var(--chakra-fonts-heading);font-weight:700;font-size:30px;line-height:40px;color:var(--chakra-colors-black);margin-top:5px;margin-bottom:5px;}@media screen and (min-width: 30em){.css-114bhkb{font-size:30px;line-height:40px;margin-top:5px;margin-bottom:5px;}}@media screen and (min-width: 48em){.css-114bhkb{font-size:45px;line-height:53px;margin-top:10px;margin-bottom:10px;}}</style><h1 class="chakra-heading css-114bhkb">HTTP Caching</h1><style data-emotion="css 1vh4uni">.css-1vh4uni{font-size:14px;color:var(--chakra-colors-gray-700);}@media screen and (min-width: 30em){.css-1vh4uni{font-size:14px;}}@media screen and (min-width: 48em){.css-1vh4uni{font-size:16px;}}</style><p class="chakra-text css-1vh4uni">Everything you need to know about web caching</p></div></div><style data-emotion="css ms16h5">.css-ms16h5{width:100%;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;max-width:var(--chakra-sizes-container-md);-webkit-padding-start:1rem;padding-inline-start:1rem;-webkit-padding-end:1rem;padding-inline-end:1rem;position:relative;}</style><div class="chakra-container css-ms16h5"><style data-emotion="css-global brzcv3">:host,:root{--chakra-ring-inset:var(--chakra-empty,/*!*/ /*!*/);--chakra-ring-offset-width:0px;--chakra-ring-offset-color:#fff;--chakra-ring-color:rgba(66, 153, 225, 0.6);--chakra-ring-offset-shadow:0 0 #0000;--chakra-ring-shadow:0 0 #0000;--chakra-space-x-reverse:0;--chakra-space-y-reverse:0;--chakra-colors-transparent:transparent;--chakra-colors-current:currentColor;--chakra-colors-black:#000000;--chakra-colors-white:#FFFFFF;--chakra-colors-whiteAlpha-50:rgba(255, 255, 255, 0.04);--chakra-colors-whiteAlpha-100:rgba(255, 255, 255, 0.06);--chakra-colors-whiteAlpha-200:rgba(255, 255, 255, 0.08);--chakra-colors-whiteAlpha-300:rgba(255, 255, 255, 0.16);--chakra-colors-whiteAlpha-400:rgba(255, 255, 255, 0.24);--chakra-colors-whiteAlpha-500:rgba(255, 255, 255, 0.36);--chakra-colors-whiteAlpha-600:rgba(255, 255, 255, 0.48);--chakra-colors-whiteAlpha-700:rgba(255, 255, 255, 0.64);--chakra-colors-whiteAlpha-800:rgba(255, 255, 255, 0.80);--chakra-colors-whiteAlpha-900:rgba(255, 255, 255, 0.92);--chakra-colors-blackAlpha-50:rgba(0, 0, 0, 0.04);--chakra-colors-blackAlpha-100:rgba(0, 0, 0, 0.06);--chakra-colors-blackAlpha-200:rgba(0, 0, 0, 0.08);--chakra-colors-blackAlpha-300:rgba(0, 0, 0, 0.16);--chakra-colors-blackAlpha-400:rgba(0, 0, 0, 0.24);--chakra-colors-blackAlpha-500:rgba(0, 0, 0, 0.36);--chakra-colors-blackAlpha-600:rgba(0, 0, 0, 0.48);--chakra-colors-blackAlpha-700:rgba(0, 0, 0, 0.64);--chakra-colors-blackAlpha-800:rgba(0, 0, 0, 0.80);--chakra-colors-blackAlpha-900:rgba(0, 0, 0, 0.92);--chakra-colors-gray-50:#F7FAFC;--chakra-colors-gray-100:#EDF2F7;--chakra-colors-gray-200:#E2E8F0;--chakra-colors-gray-300:#CBD5E0;--chakra-colors-gray-400:#A0AEC0;--chakra-colors-gray-500:#718096;--chakra-colors-gray-600:#4A5568;--chakra-colors-gray-700:#2D3748;--chakra-colors-gray-800:#1A202C;--chakra-colors-gray-900:#171923;--chakra-colors-red-50:#FFF5F5;--chakra-colors-red-100:#FED7D7;--chakra-colors-red-200:#FEB2B2;--chakra-colors-red-300:#FC8181;--chakra-colors-red-400:#F56565;--chakra-colors-red-500:#E53E3E;--chakra-colors-red-600:#C53030;--chakra-colors-red-700:#9B2C2C;--chakra-colors-red-800:#822727;--chakra-colors-red-900:#63171B;--chakra-colors-orange-50:#FFFAF0;--chakra-colors-orange-100:#FEEBC8;--chakra-colors-orange-200:#FBD38D;--chakra-colors-orange-300:#F6AD55;--chakra-colors-orange-400:#ED8936;--chakra-colors-orange-500:#DD6B20;--chakra-colors-orange-600:#C05621;--chakra-colors-orange-700:#9C4221;--chakra-colors-orange-800:#7B341E;--chakra-colors-orange-900:#652B19;--chakra-colors-yellow-50:#FFFFF0;--chakra-colors-yellow-100:#FEFCBF;--chakra-colors-yellow-200:#FAF089;--chakra-colors-yellow-300:#F6E05E;--chakra-colors-yellow-400:#ECC94B;--chakra-colors-yellow-500:#D69E2E;--chakra-colors-yellow-600:#B7791F;--chakra-colors-yellow-700:#975A16;--chakra-colors-yellow-800:#744210;--chakra-colors-yellow-900:#5F370E;--chakra-colors-green-50:#F0FFF4;--chakra-colors-green-100:#C6F6D5;--chakra-colors-green-200:#9AE6B4;--chakra-colors-green-300:#68D391;--chakra-colors-green-400:#48BB78;--chakra-colors-green-500:#38A169;--chakra-colors-green-600:#2F855A;--chakra-colors-green-700:#276749;--chakra-colors-green-800:#22543D;--chakra-colors-green-900:#1C4532;--chakra-colors-teal-50:#E6FFFA;--chakra-colors-teal-100:#B2F5EA;--chakra-colors-teal-200:#81E6D9;--chakra-colors-teal-300:#4FD1C5;--chakra-colors-teal-400:#38B2AC;--chakra-colors-teal-500:#319795;--chakra-colors-teal-600:#2C7A7B;--chakra-colors-teal-700:#285E61;--chakra-colors-teal-800:#234E52;--chakra-colors-teal-900:#1D4044;--chakra-colors-blue-50:#ebf8ff;--chakra-colors-blue-100:#bee3f8;--chakra-colors-blue-200:#90cdf4;--chakra-colors-blue-300:#63b3ed;--chakra-colors-blue-400:#4299e1;--chakra-colors-blue-500:#3182ce;--chakra-colors-blue-600:#2b6cb0;--chakra-colors-blue-700:#2c5282;--chakra-colors-blue-800:#2a4365;--chakra-colors-blue-900:#1A365D;--chakra-colors-cyan-50:#EDFDFD;--chakra-colors-cyan-100:#C4F1F9;--chakra-colors-cyan-200:#9DECF9;--chakra-colors-cyan-300:#76E4F7;--chakra-colors-cyan-400:#0BC5EA;--chakra-colors-cyan-500:#00B5D8;--chakra-colors-cyan-600:#00A3C4;--chakra-colors-cyan-700:#0987A0;--chakra-colors-cyan-800:#086F83;--chakra-colors-cyan-900:#065666;--chakra-colors-purple-50:#FAF5FF;--chakra-colors-purple-100:#E9D8FD;--chakra-colors-purple-200:#D6BCFA;--chakra-colors-purple-300:#B794F4;--chakra-colors-purple-400:#9F7AEA;--chakra-colors-purple-500:#805AD5;--chakra-colors-purple-600:#6B46C1;--chakra-colors-purple-700:#553C9A;--chakra-colors-purple-800:#44337A;--chakra-colors-purple-900:#322659;--chakra-colors-pink-50:#FFF5F7;--chakra-colors-pink-100:#FED7E2;--chakra-colors-pink-200:#FBB6CE;--chakra-colors-pink-300:#F687B3;--chakra-colors-pink-400:#ED64A6;--chakra-colors-pink-500:#D53F8C;--chakra-colors-pink-600:#B83280;--chakra-colors-pink-700:#97266D;--chakra-colors-pink-800:#702459;--chakra-colors-pink-900:#521B41;--chakra-colors-linkedin-50:#E8F4F9;--chakra-colors-linkedin-100:#CFEDFB;--chakra-colors-linkedin-200:#9BDAF3;--chakra-colors-linkedin-300:#68C7EC;--chakra-colors-linkedin-400:#34B3E4;--chakra-colors-linkedin-500:#00A0DC;--chakra-colors-linkedin-600:#008CC9;--chakra-colors-linkedin-700:#0077B5;--chakra-colors-linkedin-800:#005E93;--chakra-colors-linkedin-900:#004471;--chakra-colors-facebook-50:#E8F4F9;--chakra-colors-facebook-100:#D9DEE9;--chakra-colors-facebook-200:#B7C2DA;--chakra-colors-facebook-300:#6482C0;--chakra-colors-facebook-400:#4267B2;--chakra-colors-facebook-500:#385898;--chakra-colors-facebook-600:#314E89;--chakra-colors-facebook-700:#29487D;--chakra-colors-facebook-800:#223B67;--chakra-colors-facebook-900:#1E355B;--chakra-colors-messenger-50:#D0E6FF;--chakra-colors-messenger-100:#B9DAFF;--chakra-colors-messenger-200:#A2CDFF;--chakra-colors-messenger-300:#7AB8FF;--chakra-colors-messenger-400:#2E90FF;--chakra-colors-messenger-500:#0078FF;--chakra-colors-messenger-600:#0063D1;--chakra-colors-messenger-700:#0052AC;--chakra-colors-messenger-800:#003C7E;--chakra-colors-messenger-900:#002C5C;--chakra-colors-whatsapp-50:#dffeec;--chakra-colors-whatsapp-100:#b9f5d0;--chakra-colors-whatsapp-200:#90edb3;--chakra-colors-whatsapp-300:#65e495;--chakra-colors-whatsapp-400:#3cdd78;--chakra-colors-whatsapp-500:#22c35e;--chakra-colors-whatsapp-600:#179848;--chakra-colors-whatsapp-700:#0c6c33;--chakra-colors-whatsapp-800:#01421c;--chakra-colors-whatsapp-900:#001803;--chakra-colors-twitter-50:#E5F4FD;--chakra-colors-twitter-100:#C8E9FB;--chakra-colors-twitter-200:#A8DCFA;--chakra-colors-twitter-300:#83CDF7;--chakra-colors-twitter-400:#57BBF5;--chakra-colors-twitter-500:#1DA1F2;--chakra-colors-twitter-600:#1A94DA;--chakra-colors-twitter-700:#1681BF;--chakra-colors-twitter-800:#136B9E;--chakra-colors-twitter-900:#0D4D71;--chakra-colors-telegram-50:#E3F2F9;--chakra-colors-telegram-100:#C5E4F3;--chakra-colors-telegram-200:#A2D4EC;--chakra-colors-telegram-300:#7AC1E4;--chakra-colors-telegram-400:#47A9DA;--chakra-colors-telegram-500:#0088CC;--chakra-colors-telegram-600:#007AB8;--chakra-colors-telegram-700:#006BA1;--chakra-colors-telegram-800:#005885;--chakra-colors-telegram-900:#003F5E;--chakra-colors-brand-bg:#06020d;--chakra-colors-brand-hero:#06020d;--chakra-colors-brand-footer:#0d041e;--chakra-borders-none:0;--chakra-borders-1px:1px solid;--chakra-borders-2px:2px solid;--chakra-borders-4px:4px solid;--chakra-borders-8px:8px solid;--chakra-fonts-heading:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--chakra-fonts-body:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--chakra-fonts-mono:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--chakra-fontSizes-xs:0.75rem;--chakra-fontSizes-sm:0.875rem;--chakra-fontSizes-md:1rem;--chakra-fontSizes-lg:1.125rem;--chakra-fontSizes-xl:1.25rem;--chakra-fontSizes-2xl:1.5rem;--chakra-fontSizes-3xl:1.875rem;--chakra-fontSizes-4xl:2.25rem;--chakra-fontSizes-5xl:3rem;--chakra-fontSizes-6xl:3.75rem;--chakra-fontSizes-7xl:4.5rem;--chakra-fontSizes-8xl:6rem;--chakra-fontSizes-9xl:8rem;--chakra-fontWeights-hairline:100;--chakra-fontWeights-thin:200;--chakra-fontWeights-light:300;--chakra-fontWeights-normal:400;--chakra-fontWeights-medium:500;--chakra-fontWeights-semibold:600;--chakra-fontWeights-bold:700;--chakra-fontWeights-extrabold:800;--chakra-fontWeights-black:900;--chakra-letterSpacings-tighter:-0.05em;--chakra-letterSpacings-tight:-0.025em;--chakra-letterSpacings-normal:0;--chakra-letterSpacings-wide:0.025em;--chakra-letterSpacings-wider:0.05em;--chakra-letterSpacings-widest:0.1em;--chakra-lineHeights-3:.75rem;--chakra-lineHeights-4:1rem;--chakra-lineHeights-5:1.25rem;--chakra-lineHeights-6:1.5rem;--chakra-lineHeights-7:1.75rem;--chakra-lineHeights-8:2rem;--chakra-lineHeights-9:2.25rem;--chakra-lineHeights-10:2.5rem;--chakra-lineHeights-normal:normal;--chakra-lineHeights-none:1;--chakra-lineHeights-shorter:1.25;--chakra-lineHeights-short:1.375;--chakra-lineHeights-base:1.5;--chakra-lineHeights-tall:1.625;--chakra-lineHeights-taller:2;--chakra-radii-none:0;--chakra-radii-sm:0.125rem;--chakra-radii-base:0.25rem;--chakra-radii-md:0.375rem;--chakra-radii-lg:0.5rem;--chakra-radii-xl:0.75rem;--chakra-radii-2xl:1rem;--chakra-radii-3xl:1.5rem;--chakra-radii-full:9999px;--chakra-space-1:0.25rem;--chakra-space-2:0.5rem;--chakra-space-3:0.75rem;--chakra-space-4:1rem;--chakra-space-5:1.25rem;--chakra-space-6:1.5rem;--chakra-space-7:1.75rem;--chakra-space-8:2rem;--chakra-space-9:2.25rem;--chakra-space-10:2.5rem;--chakra-space-12:3rem;--chakra-space-14:3.5rem;--chakra-space-16:4rem;--chakra-space-20:5rem;--chakra-space-24:6rem;--chakra-space-28:7rem;--chakra-space-32:8rem;--chakra-space-36:9rem;--chakra-space-40:10rem;--chakra-space-44:11rem;--chakra-space-48:12rem;--chakra-space-52:13rem;--chakra-space-56:14rem;--chakra-space-60:15rem;--chakra-space-64:16rem;--chakra-space-72:18rem;--chakra-space-80:20rem;--chakra-space-96:24rem;--chakra-space-px:1px;--chakra-space-0\.5:0.125rem;--chakra-space-1\.5:0.375rem;--chakra-space-2\.5:0.625rem;--chakra-space-3\.5:0.875rem;--chakra-shadows-xs:0 0 0 1px rgba(0, 0, 0, 0.05);--chakra-shadows-sm:0 1px 2px 0 rgba(0, 0, 0, 0.05);--chakra-shadows-base:0 1px 3px 0 rgba(0, 0, 0, 0.1),0 1px 2px 0 rgba(0, 0, 0, 0.06);--chakra-shadows-md:0 4px 6px -1px rgba(0, 0, 0, 0.1),0 2px 4px -1px rgba(0, 0, 0, 0.06);--chakra-shadows-lg:0 10px 15px -3px rgba(0, 0, 0, 0.1),0 4px 6px -2px rgba(0, 0, 0, 0.05);--chakra-shadows-xl:0 20px 25px -5px rgba(0, 0, 0, 0.1),0 10px 10px -5px rgba(0, 0, 0, 0.04);--chakra-shadows-2xl:0 25px 50px -12px rgba(0, 0, 0, 0.25);--chakra-shadows-outline:0 0 0 3px rgba(66, 153, 225, 0.6);--chakra-shadows-inner:inset 0 2px 4px 0 rgba(0,0,0,0.06);--chakra-shadows-none:none;--chakra-shadows-dark-lg:rgba(0, 0, 0, 0.1) 0px 0px 0px 1px,rgba(0, 0, 0, 0.2) 0px 5px 10px,rgba(0, 0, 0, 0.4) 0px 15px 40px;--chakra-sizes-1:0.25rem;--chakra-sizes-2:0.5rem;--chakra-sizes-3:0.75rem;--chakra-sizes-4:1rem;--chakra-sizes-5:1.25rem;--chakra-sizes-6:1.5rem;--chakra-sizes-7:1.75rem;--chakra-sizes-8:2rem;--chakra-sizes-9:2.25rem;--chakra-sizes-10:2.5rem;--chakra-sizes-12:3rem;--chakra-sizes-14:3.5rem;--chakra-sizes-16:4rem;--chakra-sizes-20:5rem;--chakra-sizes-24:6rem;--chakra-sizes-28:7rem;--chakra-sizes-32:8rem;--chakra-sizes-36:9rem;--chakra-sizes-40:10rem;--chakra-sizes-44:11rem;--chakra-sizes-48:12rem;--chakra-sizes-52:13rem;--chakra-sizes-56:14rem;--chakra-sizes-60:15rem;--chakra-sizes-64:16rem;--chakra-sizes-72:18rem;--chakra-sizes-80:20rem;--chakra-sizes-96:24rem;--chakra-sizes-px:1px;--chakra-sizes-0\.5:0.125rem;--chakra-sizes-1\.5:0.375rem;--chakra-sizes-2\.5:0.625rem;--chakra-sizes-3\.5:0.875rem;--chakra-sizes-max:max-content;--chakra-sizes-min:min-content;--chakra-sizes-full:100%;--chakra-sizes-3xs:14rem;--chakra-sizes-2xs:16rem;--chakra-sizes-xs:20rem;--chakra-sizes-sm:24rem;--chakra-sizes-md:28rem;--chakra-sizes-lg:32rem;--chakra-sizes-xl:36rem;--chakra-sizes-2xl:42rem;--chakra-sizes-3xl:48rem;--chakra-sizes-4xl:56rem;--chakra-sizes-5xl:64rem;--chakra-sizes-6xl:72rem;--chakra-sizes-7xl:80rem;--chakra-sizes-8xl:90rem;--chakra-sizes-container-sm:640px;--chakra-sizes-container-md:768px;--chakra-sizes-container-lg:1024px;--chakra-sizes-container-xl:1280px;--chakra-zIndices-hide:-1;--chakra-zIndices-auto:auto;--chakra-zIndices-base:0;--chakra-zIndices-docked:10;--chakra-zIndices-dropdown:1000;--chakra-zIndices-sticky:1100;--chakra-zIndices-banner:1200;--chakra-zIndices-overlay:1300;--chakra-zIndices-modal:1400;--chakra-zIndices-popover:1500;--chakra-zIndices-skipLink:1600;--chakra-zIndices-toast:1700;--chakra-zIndices-tooltip:1800;--chakra-transition-property-common:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;--chakra-transition-property-colors:background-color,border-color,color,fill,stroke;--chakra-transition-property-dimensions:width,height;--chakra-transition-property-position:left,right,top,bottom;--chakra-transition-property-background:background-color,background-image,background-position;--chakra-transition-easing-ease-in:cubic-bezier(0.4, 0, 1, 1);--chakra-transition-easing-ease-out:cubic-bezier(0, 0, 0.2, 1);--chakra-transition-easing-ease-in-out:cubic-bezier(0.4, 0, 0.2, 1);--chakra-transition-duration-ultra-fast:50ms;--chakra-transition-duration-faster:100ms;--chakra-transition-duration-fast:150ms;--chakra-transition-duration-normal:200ms;--chakra-transition-duration-slow:300ms;--chakra-transition-duration-slower:400ms;--chakra-transition-duration-ultra-slow:500ms;--chakra-blur-none:0;--chakra-blur-sm:4px;--chakra-blur-base:8px;--chakra-blur-md:12px;--chakra-blur-lg:16px;--chakra-blur-xl:24px;--chakra-blur-2xl:40px;--chakra-blur-3xl:64px;}</style><style data-emotion="css-global 1jqlf9g">html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:system-ui,sans-serif;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;touch-action:manipulation;}body{position:relative;min-height:100%;font-feature-settings:'kern';}*,*::before,*::after{border-width:0;border-style:solid;box-sizing:border-box;}main{display:block;}hr{border-top-width:1px;box-sizing:content-box;height:0;overflow:visible;}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:1em;}a{background-color:transparent;color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit;}abbr[title]{border-bottom:none;-webkit-text-decoration:underline;text-decoration:underline;-webkit-text-decoration:underline dotted;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;}b,strong{font-weight:bold;}small{font-size:80%;}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}sub{bottom:-0.25em;}sup{top:-0.5em;}img{border-style:none;}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0;}button,input{overflow:visible;}button,select{text-transform:none;}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0;}fieldset{padding:0.35em 0.75em 0.625em;}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal;}progress{vertical-align:baseline;}textarea{overflow:auto;}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0;}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{-webkit-appearance:none!important;}input[type="number"]{-moz-appearance:textfield;}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px;}[type="search"]::-webkit-search-decoration{-webkit-appearance:none!important;}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit;}details{display:block;}summary{display:-webkit-box;display:-webkit-list-item;display:-ms-list-itembox;display:list-item;}template{display:none;}[hidden]{display:none!important;}body,blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0;}button{background:transparent;padding:0;}fieldset{margin:0;padding:0;}ol,ul{margin:0;padding:0;}textarea{resize:vertical;}button,[role="button"]{cursor:pointer;}button::-moz-focus-inner{border:0!important;}table{border-collapse:collapse;}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit;}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit;}img,svg,video,canvas,audio,iframe,embed,object{display:block;}img,video{max-width:100%;height:auto;}[data-js-focus-visible] :focus:not([data-focus-visible-added]){outline:none;box-shadow:none;}select::-ms-expand{display:none;}</style><style data-emotion="css-global 1baqkrf">body{font-family:var(--chakra-fonts-body);color:var(--chakra-colors-gray-800);background:var(--chakra-colors-white);transition-property:background-color;transition-duration:var(--chakra-transition-duration-normal);line-height:var(--chakra-lineHeights-base);}*::-webkit-input-placeholder{color:var(--chakra-colors-gray-400);}*::-moz-placeholder{color:var(--chakra-colors-gray-400);}*:-ms-input-placeholder{color:var(--chakra-colors-gray-400);}*::placeholder{color:var(--chakra-colors-gray-400);}*,*::before,::after{border-color:var(--chakra-colors-gray-200);word-wrap:break-word;}</style><p class="sc-bdvvtL kiIUjN">As users, we easily get frustrated by the buffering videos, the images that take seconds to load, pages that got stuck because the content is being loaded. Loading the resources from some cache is much faster than fetching the same from the originating server. It reduces latency, speeds up the loading of resources, decreases the load on server, cuts down the bandwidth costs etc. </p><h3 class="sc-dkPtRN sc-eCImPb dKUOdJ cabxUq">Introduction</h3><p class="sc-bdvvtL kiIUjN">What is web cache? It is something that sits somewhere between the client and the server, continuously looking at the requests and their responses, looking for any responses that can be cached. So that there is less time consumed when the same request is made again. </p><p class="sc-bdvvtL kiIUjN"><img src="https://i.imgur.com/mJYVvTh.png" alt="Web Cache" class="sc-iqseJM bIxQHp"/></p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Note that this image is just to give you an idea. Depending upon the type of cache, the place where it is implemented could vary. More on this later.</p></blockquote><p class="sc-bdvvtL kiIUjN">Before we get into further details, let me give you an overview of the terms that will be used, further in the article</p><ul class="sc-egiyK gfrORe"><li class="sc-bqiRlB xTMXv"><strong>Client</strong> could be your browser or any application requesting the server for some resource</li><li class="sc-bqiRlB xTMXv"><strong>Origin Server</strong>, the source of truth, houses all the content required by the client and is responsible for fulfilling the client requests.</li><li class="sc-bqiRlB xTMXv"><strong>Stale Content</strong> is the cached but expired content</li><li class="sc-bqiRlB xTMXv"><strong>Fresh Content</strong> is the content available in cache that hasn't expired yet</li><li class="sc-bqiRlB xTMXv"><strong>Cache Validation</strong> is the process of contacting the server to check the validity of the cached content and get it updated for when it is going to expire</li><li class="sc-bqiRlB xTMXv"><strong>Cache Invalidation</strong> is the process of removing any stale content available in the cache</li></ul><p class="sc-bdvvtL kiIUjN"><img src="https://i.imgur.com/9MjlzvW.png" class="sc-iqseJM bIxQHp"/></p><h3 class="sc-dkPtRN sc-eCImPb dKUOdJ cabxUq">Caching Locations</h3><p class="sc-bdvvtL kiIUjN">Web cache can be shared or private depending upon the location where it exists. Here is the list of different caching locations</p><ul class="sc-egiyK gfrORe"><li class="sc-bqiRlB xTMXv"><a href="#browser-cache" target="_self" class="sc-crHmcD gJMBjK">Browser Cache</a></li><li class="sc-bqiRlB xTMXv"><a href="#proxy-cache" target="_self" class="sc-crHmcD gJMBjK">Proxy Cache</a></li><li class="sc-bqiRlB xTMXv"><a href="#reverse-proxy-cache" target="_self" class="sc-crHmcD gJMBjK">Reverse Proxy Cache</a></li></ul><h4 class="sc-dkPtRN sc-jRQBWg dKUOdJ gRXaYU">Browser Cache</h4><p class="sc-bdvvtL kiIUjN">You might have noticed that when you click the back button in your browser it takes less time to load the page than the time that it took during the first load; this is the browser cache in play. Browser cache is the most common location for caching and browsers usually reserve some space for it.</p><p class="sc-bdvvtL kiIUjN"><img src="https://i.imgur.com/mJYVvTh.png" alt="Web Cache" class="sc-iqseJM bIxQHp"/></p><p class="sc-bdvvtL kiIUjN">A browser cache is limited to just one user and unlike other caches, it can store the "private" responses. More on it later.</p><h4 class="sc-dkPtRN sc-jRQBWg dKUOdJ gRXaYU">Proxy Cache</h4><p class="sc-bdvvtL kiIUjN">Unlike browser cache which serves a single user, proxy caches may serve hundreds of different users accessing the same content. They are usually implemented on a broader level by ISPs or any other independent entities for example.</p><p class="sc-bdvvtL kiIUjN"><img src="https://i.imgur.com/3mj6e1O.png" alt="Proxy Cache" class="sc-iqseJM bIxQHp"/></p><h4 class="sc-dkPtRN sc-jRQBWg dKUOdJ gRXaYU">Reverse Proxy Cache</h4><p class="sc-bdvvtL kiIUjN">Reverse proxy cache or surrogate cache is implemented close to the origin servers in order to reduce the load on server. Unlike proxy caches which are implemented by ISPs etc to reduce the bandwidth usage in a network, surrogates or reverse proxy caches are implemented near to the origin servers by the server administrators to reduce the load on server.</p><p class="sc-bdvvtL kiIUjN"><img src="http://i.imgur.com/Eg4Cru3.png" alt="Reverse Proxy Cache" class="sc-iqseJM bIxQHp"/></p><p class="sc-bdvvtL kiIUjN">Although you can control the reverse proxy caches (since it is implemented by you on your server) you can not avoid or control browser and proxy caches. And if your website is not configured to use these caches properly, it will still be cached using whatever the defaults are set on these caches.</p><h3 class="sc-dkPtRN sc-eCImPb dKUOdJ cabxUq">Caching Headers</h3><p class="sc-bdvvtL kiIUjN">So, how do we control the web cache? Whenever the server emits some response, it is accompanied with some HTTP headers to guide the caches whether and how to cache this response. Content provider is the one that has to make sure to return proper HTTP headers to force the caches on how to cache the content.</p><ul class="sc-egiyK gfrORe"><li class="sc-bqiRlB xTMXv"><a href="#expires" target="_self" class="sc-crHmcD gJMBjK">Expires</a></li><li class="sc-bqiRlB xTMXv"><a href="#pragma" target="_self" class="sc-crHmcD gJMBjK">Pragma</a></li><li class="sc-bqiRlB xTMXv"><a href="#cache-control" target="_self" class="sc-crHmcD gJMBjK">Cache-Control</a><ul class="sc-egiyK gfrORe"><li class="sc-bqiRlB xTMXv"><a href="#private" target="_self" class="sc-crHmcD gJMBjK">private</a></li><li class="sc-bqiRlB xTMXv"><a href="#public" target="_self" class="sc-crHmcD gJMBjK">public</a></li><li class="sc-bqiRlB xTMXv"><a href="#no-store" target="_self" class="sc-crHmcD gJMBjK">no-store</a></li><li class="sc-bqiRlB xTMXv"><a href="#no-cache" target="_self" class="sc-crHmcD gJMBjK">no-cache</a></li><li class="sc-bqiRlB xTMXv"><a href="#max-age" target="_self" class="sc-crHmcD gJMBjK">max-age: seconds</a></li><li class="sc-bqiRlB xTMXv"><a href="#s-maxage" target="_self" class="sc-crHmcD gJMBjK">s-maxage: seconds</a></li><li class="sc-bqiRlB xTMXv"><a href="#must-revalidate" target="_self" class="sc-crHmcD gJMBjK">must-revalidate</a></li><li class="sc-bqiRlB xTMXv"><a href="#proxy-revalidate" target="_self" class="sc-crHmcD gJMBjK">proxy-revalidate</a></li><li class="sc-bqiRlB xTMXv"><a href="#mixing-values" target="_self" class="sc-crHmcD gJMBjK">Mixing Values</a></li></ul></li><li class="sc-bqiRlB xTMXv"><a href="#validators" target="_self" class="sc-crHmcD gJMBjK">Validators</a><ul class="sc-egiyK gfrORe"><li class="sc-bqiRlB xTMXv"><a href="#etag" target="_self" class="sc-crHmcD gJMBjK">ETag</a></li><li class="sc-bqiRlB xTMXv"><a href="#last-modified" target="_self" class="sc-crHmcD gJMBjK">Last-Modified</a></li></ul></li></ul><h4 class="sc-dkPtRN sc-jRQBWg dKUOdJ gRXaYU">Expires</h4><p class="sc-bdvvtL kiIUjN">Before HTTP/1.1 and introduction of <code>Cache-Control</code>, there was <code>Expires</code> header which is simply a timestamp telling the caches how long should some content be considered fresh. Possible value to this header is absolute expiry date; where date has to be in GMT. Below is the sample header</p><pre class="sc-furwcr jiGIaj language-html"><style data-emotion="css 4m8w8z">.css-4m8w8z{display:inline-block;font-family:var(--chakra-fonts-mono);font-size:var(--chakra-fontSizes-sm);-webkit-padding-start:0.2em;padding-inline-start:0.2em;-webkit-padding-end:0.2em;padding-inline-end:0.2em;border-radius:var(--chakra-radii-sm);background:var(--chakra-colors-gray-100);color:var(--chakra-colors-gray-800);}</style><code class="chakra-code language-html css-4m8w8z">Expires: Mon, 13 Mar 2017 12:22:00 GMT
|
||
</code></pre><p class="sc-bdvvtL kiIUjN">It should be noted that the date cannot be more than a year and if the date format is wrong, content will be considered stale. Also, the clock on cache has to be in sync with the clock on server, otherwise the desired results might not be achieved. </p><p class="sc-bdvvtL kiIUjN">Although, <code>Expires</code> header is still valid and is supported widely by the caches, preference should be given to HTTP/1.1 successor of it i.e. <code>Cache-Control</code>. </p><h4 class="sc-dkPtRN sc-jRQBWg dKUOdJ gRXaYU">Pragma</h4><p class="sc-bdvvtL kiIUjN">Another one from the old, pre HTTP/1.1 days, is <code>Pragma</code>. Everything that it could do is now possible using the cache-control header given below. However, one thing I would like to point out about it is, you might see <code>Pragma: no-cache</code> being used here and there in hopes of stopping the response from being cached. It might not necessarily work; as HTTP specification discusses it in the request headers and there is no mention of it in the response headers. Rather <code>Cache-Control</code> header should be used to control the caching.</p><h4 class="sc-dkPtRN sc-jRQBWg dKUOdJ gRXaYU">Cache-Control</h4><p class="sc-bdvvtL kiIUjN">Cache-Control specifies how long and in what manner should the content be cached. This family of headers was introduced in HTTP/1.1 to overcome the limitations of the <code>Expires</code> header.</p><p class="sc-bdvvtL kiIUjN">Value for the <code>Cache-Control</code> header is composite i.e. it can have multiple directive/values. Let's look at the possible values that this header may contain. </p><h5 class="sc-dkPtRN sc-gKclnd dKUOdJ dZmLzd">private</h5><p class="sc-bdvvtL kiIUjN">Setting the cache to <code>private</code> means that the content will not be cached in any of the proxies and it will only be cached by the client (i.e. browser)</p><pre class="sc-furwcr jiGIaj language-html"><code class="chakra-code language-html css-4m8w8z">Cache-Control: private
|
||
</code></pre><p class="sc-bdvvtL kiIUjN">Having said that, don't let it fool you in to thinking that setting this header will make your data any secure; you still have to use SSL for that purpose. </p><h5 class="sc-dkPtRN sc-gKclnd dKUOdJ dZmLzd">public</h5><p class="sc-bdvvtL kiIUjN">If set to <code>public</code>, apart from being cached by the client, it can also be cached by the proxies; serving many other users</p><pre class="sc-furwcr jiGIaj language-html"><code class="chakra-code language-html css-4m8w8z">Cache-Control: public
|
||
</code></pre><h5 class="sc-dkPtRN sc-gKclnd dKUOdJ dZmLzd">no-store</h5><p class="sc-bdvvtL kiIUjN"><strong><code>no-store</code></strong> specifies that the content is not to be cached by any of the caches</p><pre class="sc-furwcr jiGIaj language-html"><code class="chakra-code language-html css-4m8w8z">Cache-Control: no-store
|
||
</code></pre><h5 class="sc-dkPtRN sc-gKclnd dKUOdJ dZmLzd">no-cache</h5><p class="sc-bdvvtL kiIUjN"><strong><code>no-cache</code></strong> indicates that the cache can be maintained but the cached content is to be re-validated (using <code>ETag</code> for example) from the server before being served. That is, there is still a request to server but for validation and not to download the cached content.</p><pre class="sc-furwcr jiGIaj language-html"><code class="chakra-code language-html css-4m8w8z">Cache-Control: max-age=3600, no-cache, public
|
||
</code></pre><h5 class="sc-dkPtRN sc-gKclnd dKUOdJ dZmLzd">max-age: seconds</h5><p class="sc-bdvvtL kiIUjN"><strong><code>max-age</code></strong> specifies the number of seconds for which the content will be cached. For example, if the <code>cache-control</code> looks like below:</p><pre class="sc-furwcr jiGIaj language-html"><code class="chakra-code language-html css-4m8w8z">Cache-Control: max-age=3600, public
|
||
</code></pre><p class="sc-bdvvtL kiIUjN">it would mean that the content is publicly cacheable and will be considered stale after 60 minutes</p><h5 class="sc-dkPtRN sc-gKclnd dKUOdJ dZmLzd">s-maxage: seconds</h5><p class="sc-bdvvtL kiIUjN"><strong><code>s-maxage</code></strong> here <code>s-</code> prefix stands for shared. This directive specifically targets the shared caches. Like <code>max-age</code> it also gets the number of seconds for which something is to be cached. If present, it will override <code>max-age</code> and <code>expires</code> headers for shared caching.</p><pre class="sc-furwcr jiGIaj language-html"><code class="chakra-code language-html css-4m8w8z">Cache-Control: s-maxage=3600, public
|
||
</code></pre><h5 class="sc-dkPtRN sc-gKclnd dKUOdJ dZmLzd">must-revalidate</h5><p class="sc-bdvvtL kiIUjN"><strong><code>must-revalidate</code></strong> it might happen sometimes that if you have network problems and the content cannot be retrieved from the server, browser may serve stale content without validation. <code>must-revalidate</code> avoids that. If this directive is present, it means that stale content cannot be served in any case and the data must be re-validated from the server before serving. </p><pre class="sc-furwcr jiGIaj language-html"><code class="chakra-code language-html css-4m8w8z">Cache-Control: max-age=3600, public, must-revalidate
|
||
</code></pre><h5 class="sc-dkPtRN sc-gKclnd dKUOdJ dZmLzd">proxy-revalidate</h5><p class="sc-bdvvtL kiIUjN"><strong><code>proxy-revalidate</code></strong> is similar to <code>must-revalidate</code> but it specifies the same for shared or proxy caches. In other words <code>proxy-revalidate</code> is to <code>must-revalidate</code> as <code>s-maxage</code> is to <code>max-age</code>. But why did they not call it <code>s-revalidate</code>?. I have no idea why, if you have any clue please leave a comment below. </p><h5 class="sc-dkPtRN sc-gKclnd dKUOdJ dZmLzd">Mixing Values</h5><p class="sc-bdvvtL kiIUjN">You can combine these directives in different ways to achieve different caching behaviors, however <code>no-cache/no-store</code> and <code>public/private</code> are mutually exclusive. </p><p class="sc-bdvvtL kiIUjN">If you specify both <code>no-store</code> and <code>no-cache</code>, <code>no-store</code> will be given precedence over <code>no-cache</code>.</p><pre class="sc-furwcr jiGIaj language-html"><code class="chakra-code language-html css-4m8w8z">; If specified both
|
||
Cache-Control: no-store, no-cache
|
||
|
||
; Below will be considered
|
||
Cache-Control: no-store
|
||
</code></pre><p class="sc-bdvvtL kiIUjN">For <code>private/public</code>, for any unauthenticated requests cache is considered <code>public</code> and for any authenticated ones cache is considered <code>private</code>.</p><h3 class="sc-dkPtRN sc-eCImPb dKUOdJ cabxUq">Validators</h3><p class="sc-bdvvtL kiIUjN">Up until now we only discussed how the content is cached and how long the cached content is to be considered fresh but we did not discuss how the client does the validation from the server. Below we discuss the headers used for this purpose.</p><h4 class="sc-dkPtRN sc-jRQBWg dKUOdJ gRXaYU">ETag</h4><p class="sc-bdvvtL kiIUjN">Etag or "entity tag" was introduced in HTTP/1.1 specs. Etag is just a unique identifier that the server attaches with some resource. This ETag is later on used by the client to make conditional HTTP requests stating <code>"give me this resource if ETag is not same as the ETag that I have"</code> and the content is downloaded only if the etags do not match. </p><p class="sc-bdvvtL kiIUjN">Method by which ETag is generated is not specified in the HTTP docs and usually some collision-resistant hash function is used to assign etags to each version of a resource. There could be two types of etags i.e. strong and weak</p><pre class="sc-furwcr jiGIaj language-html"><code class="chakra-code language-html css-4m8w8z">ETag: "j82j8232ha7sdh0q2882" - Strong Etag
|
||
ETag: W/"j82j8232ha7sdh0q2882" - Weak Etag (prefixed with `W/`)
|
||
</code></pre><p class="sc-bdvvtL kiIUjN">A strong validating ETag means that two resources are <strong>exactly</strong> same and there is no difference between them at all. While a weak ETag means that two resources are although not strictly same but could be considered same. Weak etags might be useful for dynamic content, for example.</p><p class="sc-bdvvtL kiIUjN">Now you know what etags are but how does the browser make this request? by making a request to server while sending the available Etag in <code>If-None-Match</code> header.</p><p class="sc-bdvvtL kiIUjN">Consider the scenario, you opened a web page which loaded a logo image with caching period of 60 seconds and ETag of <code>abc123xyz</code>. After about 30 minutes you reload the page, browser will notice that the logo which was fresh for 60 seconds is now stale; it will trigger a request to server, sending the ETag of the stale logo image in <code>if-none-match</code> header</p><pre class="sc-furwcr jiGIaj language-html"><code class="chakra-code language-html css-4m8w8z">If-None-Match: "abc123xyz"
|
||
</code></pre><p class="sc-bdvvtL kiIUjN">Server will then compare this ETag with the ETag of the current version of resource. If both etags are matched, server will send back the response of <code>304 Not Modified</code> which will tell the client that the copy that it has is still good and it will be considered fresh for another 60 seconds. If both the etags do not match i.e. the logo has likely changed and client will be sent the new logo which it will use to replace the stale logo that it has.</p><h4 class="sc-dkPtRN sc-jRQBWg dKUOdJ gRXaYU">Last-Modified</h4><p class="sc-bdvvtL kiIUjN">Server might include the <code>Last-Modified</code> header indicating the date and time at which some content was last modified on.</p><pre class="sc-furwcr jiGIaj language-html"><code class="chakra-code language-html css-4m8w8z">Last-Modified: Wed, 15 Mar 2017 12:30:26 GMT
|
||
</code></pre><p class="sc-bdvvtL kiIUjN">When the content gets stale, client will make a conditional request including the last modified date that it has inside the header called <code>If-Modified-Since</code> to server to get the updated <code>Last-Modified</code> date; if it matches the date that the client has, <code>Last-Modified</code> date for the content is updated to be considered fresh for another <code>n</code> seconds. If the received <code>Last-Modified</code> date does not match the one that the client has, content is reloaded from the server and replaced with the content that client has.</p><pre class="sc-furwcr jiGIaj language-html"><code class="chakra-code language-html css-4m8w8z">If-Modified-Since: Wed, 15 Mar 2017 12:30:26 GMT
|
||
</code></pre><p class="sc-bdvvtL kiIUjN">You might be questioning now, what if the cached content has both the <code>Last-Modified</code> and <code>ETag</code> assigned to it? Well, in that case both are to be used i.e. there will not be any re-downloading of the resource if and only if <code>ETag</code> matches the newly retrieved one and so does the <code>Last-Modified</code> date. If either the <code>ETag</code> does not match or the <code>Last-Modified</code> is greater than the one from the server, content has to be downloaded again. </p><h3 class="sc-dkPtRN sc-eCImPb dKUOdJ cabxUq">Where do I start?</h3><p class="sc-bdvvtL kiIUjN">Now that we have got <em>everything</em> covered, let us put everything in perspective and see how you can use this information.</p><h4 class="sc-dkPtRN sc-jRQBWg dKUOdJ gRXaYU">Utilizing Server</h4><p class="sc-bdvvtL kiIUjN">Before we get into the possible caching strategies , let me add the fact that most of the servers including Apache and Nginx allow you to implement your caching policy through the server so that you don't have to juggle with headers in your code. </p><p class="sc-bdvvtL kiIUjN"><strong>For example</strong>, if you are using Apache and you have your static content placed at <code>/static</code>, you can put below <code>.htaccess</code> file in the directory to make all the content in it be cached for an year using below</p><pre class="sc-furwcr jiGIaj language-html"><code class="chakra-code language-html css-4m8w8z"># Cache everything for an year
|
||
Header set Cache-Control "max-age=31536000, public"
|
||
</code></pre><p class="sc-bdvvtL kiIUjN">You can further use <code>filesMatch</code> directive to add conditionals and use different caching strategy for different kinds of files e.g.</p><pre class="sc-furwcr jiGIaj language-html"><code class="chakra-code language-html css-4m8w8z"># Cache any images for one year
|
||
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>filesMatch</span> <span class="token attr-name">".(png|jpg|jpeg|gif)$"</span><span class="token punctuation">></span></span>
|
||
Header set Cache-Control "max-age=31536000, public"
|
||
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>filesMatch</span><span class="token punctuation">></span></span>
|
||
|
||
# Cache any CSS and JS files for a month
|
||
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>filesMatch</span> <span class="token attr-name">".(css|js)$"</span><span class="token punctuation">></span></span>
|
||
Header set Cache-Control "max-age=2628000, public"
|
||
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>filesMatch</span><span class="token punctuation">></span></span>
|
||
</code></pre><p class="sc-bdvvtL kiIUjN">Or if you don't want to use the <code>.htaccess</code> file you can modify Apache's configuration file <code>http.conf</code>. Same goes for Nginx, you can add the caching information in the location or server block. </p><h4 class="sc-dkPtRN sc-jRQBWg dKUOdJ gRXaYU">Caching Recommendations</h4><p class="sc-bdvvtL kiIUjN">There is no golden rule or set standards about how your caching policy should look like, each of the application is different and you have to look and find what suits your application the best. However, just to give you a rough idea</p><ul class="sc-egiyK gfrORe"><li class="sc-bqiRlB xTMXv">You can have aggressive caching (e.g. cache for an year) on any static content and use fingerprinted filenames (e.g. <code>style.ju2i90.css</code>) so that the cache is automatically rejected whenever the files are updated.
|
||
Also it should be noted that you should not cross the upper limit of one year as it <a href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9" target="_blank" rel="nofollow" class="sc-crHmcD gJMBjK">might not be honored</a> </li><li class="sc-bqiRlB xTMXv">Look and decide do you even need caching for any dynamic content, if yes how long it should be. For example, in case of some RSS feed of a blog there could be the caching of a few hours but there couldn't be any caching for inventory items in an ERP.</li><li class="sc-bqiRlB xTMXv">Always add the validators (preferably ETags) in your response.</li><li class="sc-bqiRlB xTMXv">Pay attention while choosing the visibility (private or public) of the cached content. Make sure that you do not accidentally cache any user-specific or sensitive content in any public proxies. When in doubt, do not use cache at all.</li><li class="sc-bqiRlB xTMXv">Separate the content that changes often from the content that doesn't change that often (e.g. in javascript bundles) so that when it is updated it doesn't need to make the whole cached content stale. </li><li class="sc-bqiRlB xTMXv">Test and monitor the caching headers being served by your site. You can use the browser console or <code>curl -I http://some-url.com</code> for that purpose. </li></ul><p class="sc-bdvvtL kiIUjN">And that about wraps it up. Stay tuned for more!</p><span></span></div></div><style data-emotion="css zeuzl6">.css-zeuzl6{background:var(--chakra-colors-white);border-top-width:1px;padding-top:45px;padding-bottom:60px;text-align:center;}@media screen and (min-width: 30em){.css-zeuzl6{padding-top:45px;padding-bottom:60px;}}@media screen and (min-width: 48em){.css-zeuzl6{padding-top:70px;padding-bottom:90px;}}</style><div class="css-zeuzl6"><div class="chakra-container css-nm5t63"><style data-emotion="css 482acf">.css-482acf{font-family:var(--chakra-fonts-heading);font-weight:var(--chakra-fontWeights-bold);font-size:25px;line-height:1.33;margin-bottom:10px;}@media screen and (min-width: 30em){.css-482acf{font-size:25px;margin-bottom:10px;}}@media screen and (min-width: 48em){.css-482acf{font-size:35px;line-height:1.2;margin-bottom:20px;}}</style><h2 class="chakra-heading css-482acf">Open Source</h2><style data-emotion="css tmji1h">.css-tmji1h{line-height:26px;font-size:15px;margin-bottom:20px;}@media screen and (min-width: 30em){.css-tmji1h{font-size:15px;}}@media screen and (min-width: 48em){.css-tmji1h{font-size:16px;}}</style><p class="chakra-text css-tmji1h">The project is OpenSource, <style data-emotion="css 1om4i6h">.css-1om4i6h{transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-fast);transition-timing-function:var(--chakra-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:none;text-decoration:none;outline:2px solid transparent;outline-offset:2px;color:inherit;border-bottom-width:1px;font-weight:600;}.css-1om4i6h:hover,.css-1om4i6h[data-hover]{-webkit-text-decoration:none;text-decoration:none;}.css-1om4i6h:focus,.css-1om4i6h[data-focus]{box-shadow:var(--chakra-shadows-outline);}</style><a target="_blank" class="chakra-link css-1om4i6h" href="https://github.com/search?o=desc&q=stars%3A%3E100000&s=stars&type=Repositories">7th most starred project on GitHub</a> and is visited by hundreds of thousands of developers every month.</p><iframe src="https://ghbtns.com/github-btn.html?user=kamranahmedse&repo=developer-roadmap&type=star&count=true&size=large" frameBorder="0" scrolling="0" width="170" height="30" style="margin:auto;margin-bottom:30px" title="GitHub"></iframe><style data-emotion="css mz2q9v">.css-mz2q9v{line-height:25px;font-size:15px;margin-bottom:15px;}@media screen and (min-width: 30em){.css-mz2q9v{line-height:25px;font-size:15px;}}@media screen and (min-width: 48em){.css-mz2q9v{line-height:26px;font-size:16px;}}</style><p class="chakra-text css-mz2q9v">A considerable amount of my time is spent doing unpaid community work on things that I hope will help humanity in some way. Your sponsorship helps me continue to produce more open-source and free educational material consumed by hundreds of thousands of developers every month.</p><div class="css-0"><iframe src="https://ghbtns.com/github-btn.html?user=kamranahmedse&type=sponsor&size=large" frameBorder="0" scrolling="0" width="260" height="30" title="GitHub" style="margin:auto"></iframe></div></div></div><style data-emotion="css llwly4">.css-llwly4{border-top-width:1px;padding-top:40px;padding-bottom:40px;text-align:left;background:var(--chakra-colors-brand-footer);}@media screen and (min-width: 30em){.css-llwly4{padding-top:40px;padding-bottom:45px;}}@media screen and (min-width: 48em){.css-llwly4{padding-top:70px;padding-bottom:80px;}}</style><div class="css-llwly4"><div class="chakra-container css-nm5t63"><style data-emotion="css 1bjthgu">.css-1bjthgu{font-family:var(--chakra-fonts-heading);font-weight:var(--chakra-fontWeights-bold);font-size:25px;line-height:1.33;color:var(--chakra-colors-gray-100);margin-bottom:5px;}@media screen and (min-width: 30em){.css-1bjthgu{font-size:25px;margin-bottom:5px;}}@media screen and (min-width: 48em){.css-1bjthgu{font-size:35px;line-height:1.2;margin-bottom:15px;}}</style><h2 class="chakra-heading css-1bjthgu">Stay Informed</h2><style data-emotion="css 1ne3i1y">.css-1ne3i1y{color:var(--chakra-colors-gray-400);line-height:26px;font-size:15px;margin-bottom:20px;}@media screen and (min-width: 30em){.css-1ne3i1y{font-size:15px;}}@media screen and (min-width: 48em){.css-1ne3i1y{font-size:16px;}}</style><p class="chakra-text css-1ne3i1y">Subscribe yourself to get updates, new guides, videos and roadmaps in your inbox.</p><style data-emotion="css u91i2o">.css-u91i2o{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}@media screen and (min-width: 30em){.css-u91i2o{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}@media screen and (min-width: 48em){.css-u91i2o{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;}}</style><div class="css-u91i2o"><style data-emotion="css bjg6se">.css-bjg6se{margin-right:0px;margin-bottom:15px;}@media screen and (min-width: 30em){.css-bjg6se{margin-right:0px;margin-bottom:15px;}}@media screen and (min-width: 48em){.css-bjg6se{margin-right:20px;margin-bottom:0px;}}</style><div class="css-bjg6se"><style data-emotion="css 6cpjh7">.css-6cpjh7{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;white-space:nowrap;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;width:var(--chakra-sizes-full);line-height:1.2;border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-semibold);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);height:var(--chakra-sizes-10);min-width:var(--chakra-sizes-10);font-size:14px;-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);border:1px solid;border-color:currentColor;color:var(--chakra-colors-green-600);background:var(--chakra-colors-transparent);border-width:2px;}@media screen and (min-width: 30em){.css-6cpjh7{width:auto;font-size:14px;}}.css-6cpjh7:focus,.css-6cpjh7[data-focus]{box-shadow:var(--chakra-shadows-outline);}.css-6cpjh7[disabled],.css-6cpjh7[aria-disabled=true],.css-6cpjh7[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-6cpjh7:hover,.css-6cpjh7[data-hover]{color:var(--chakra-colors-green-200);-webkit-text-decoration:none;text-decoration:none;}@media screen and (min-width: 48em){.css-6cpjh7{font-size:16px;}}.css-6cpjh7:active,.css-6cpjh7[data-active]{background:var(--chakra-colors-green-100);}</style><style data-emotion="css 198h90r">.css-198h90r{transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-fast);transition-timing-function:var(--chakra-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:none;text-decoration:none;outline:2px solid transparent;outline-offset:2px;color:inherit;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;white-space:nowrap;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;width:var(--chakra-sizes-full);line-height:1.2;border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-semibold);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);height:var(--chakra-sizes-10);min-width:var(--chakra-sizes-10);font-size:14px;-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);border:1px solid;border-color:currentColor;color:var(--chakra-colors-green-600);background:var(--chakra-colors-transparent);border-width:2px;}.css-198h90r:hover,.css-198h90r[data-hover]{-webkit-text-decoration:underline;text-decoration:underline;}.css-198h90r:focus,.css-198h90r[data-focus]{box-shadow:var(--chakra-shadows-outline);}@media screen and (min-width: 30em){.css-198h90r{width:auto;font-size:14px;}}.css-198h90r:focus,.css-198h90r[data-focus]{box-shadow:var(--chakra-shadows-outline);}.css-198h90r[disabled],.css-198h90r[aria-disabled=true],.css-198h90r[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-198h90r:hover,.css-198h90r[data-hover]{color:var(--chakra-colors-green-200);-webkit-text-decoration:none;text-decoration:none;}@media screen and (min-width: 48em){.css-198h90r{font-size:16px;}}.css-198h90r:active,.css-198h90r[data-active]{background:var(--chakra-colors-green-100);}</style><a class="chakra-link chakra-button css-198h90r" href="/signup">Subscribe to Updates</a><style data-emotion="css ilygfh">.css-ilygfh{color:var(--chakra-colors-gray-500);font-size:13px;margin-top:5px;}</style><p class="chakra-text css-ilygfh">Free subscription for updates</p></div><div class="css-0"><style data-emotion="css 1o5lodd">.css-1o5lodd{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;white-space:nowrap;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;width:var(--chakra-sizes-full);line-height:1.2;border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-semibold);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);height:var(--chakra-sizes-10);min-width:var(--chakra-sizes-10);font-size:14px;-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);background:var(--chakra-colors-yellow-400);color:var(--chakra-colors-black);}@media screen and (min-width: 30em){.css-1o5lodd{width:auto;font-size:14px;}}.css-1o5lodd:focus,.css-1o5lodd[data-focus]{box-shadow:var(--chakra-shadows-outline);}.css-1o5lodd[disabled],.css-1o5lodd[aria-disabled=true],.css-1o5lodd[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-1o5lodd:hover,.css-1o5lodd[data-hover]{-webkit-text-decoration:none;text-decoration:none;background:var(--chakra-colors-yellow-500);}@media screen and (min-width: 48em){.css-1o5lodd{font-size:16px;}}.css-1o5lodd:active,.css-1o5lodd[data-active]{background:var(--chakra-colors-yellow-600);}</style><style data-emotion="css 1matfw4">.css-1matfw4{transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-fast);transition-timing-function:var(--chakra-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:none;text-decoration:none;outline:2px solid transparent;outline-offset:2px;color:inherit;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;white-space:nowrap;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;width:var(--chakra-sizes-full);line-height:1.2;border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-semibold);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);height:var(--chakra-sizes-10);min-width:var(--chakra-sizes-10);font-size:14px;-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);background:var(--chakra-colors-yellow-400);color:var(--chakra-colors-black);}.css-1matfw4:hover,.css-1matfw4[data-hover]{-webkit-text-decoration:underline;text-decoration:underline;}.css-1matfw4:focus,.css-1matfw4[data-focus]{box-shadow:var(--chakra-shadows-outline);}@media screen and (min-width: 30em){.css-1matfw4{width:auto;font-size:14px;}}.css-1matfw4:focus,.css-1matfw4[data-focus]{box-shadow:var(--chakra-shadows-outline);}.css-1matfw4[disabled],.css-1matfw4[aria-disabled=true],.css-1matfw4[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-1matfw4:hover,.css-1matfw4[data-hover]{-webkit-text-decoration:none;text-decoration:none;background:var(--chakra-colors-yellow-500);}@media screen and (min-width: 48em){.css-1matfw4{font-size:16px;}}.css-1matfw4:active,.css-1matfw4[data-active]{background:var(--chakra-colors-yellow-600);}</style><a target="_blank" class="chakra-link chakra-button css-1matfw4" href="https://github.com/sponsors/kamranahmedse">Updates & Paid Content</a><p class="chakra-text css-ilygfh">Support the project by paying as little as<!-- --> <style data-emotion="css 35ezg3">.css-35ezg3{font-weight:600;}</style><span class="chakra-text css-35ezg3">5$ per month</span></p></div></div></div></div><style data-emotion="css t1u31f">.css-t1u31f{background:var(--chakra-colors-brand-hero);padding:25px 0;}@media screen and (min-width: 30em){.css-t1u31f{padding:25px 0;}}@media screen and (min-width: 48em){.css-t1u31f{padding:40px 0;}}</style><div class="css-t1u31f"><div class="chakra-container css-nm5t63"><style data-emotion="css 1cvpnh4">.css-1cvpnh4{display:none;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;color:var(--chakra-colors-gray-400);font-weight:600;}.css-1cvpnh4>*:not(style)~*:not(style){margin-top:0px;-webkit-margin-end:0px;margin-inline-end:0px;margin-bottom:0px;-webkit-margin-start:30px;margin-inline-start:30px;}@media screen and (min-width: 30em){.css-1cvpnh4{display:none;}}@media screen and (min-width: 48em){.css-1cvpnh4{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}</style><div class="chakra-stack css-1cvpnh4"><style data-emotion="css 1807wg8">.css-1807wg8{transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-fast);transition-timing-function:var(--chakra-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:none;text-decoration:none;outline:2px solid transparent;outline-offset:2px;color:inherit;}.css-1807wg8:hover,.css-1807wg8[data-hover]{color:var(--chakra-colors-white);}.css-1807wg8:focus,.css-1807wg8[data-focus]{box-shadow:var(--chakra-shadows-outline);}</style><a class="chakra-link css-1807wg8" href="/roadmaps">Roadmaps</a><a class="chakra-link css-1807wg8" href="/guides">Guides</a><a class="chakra-link css-1807wg8" href="/watch">Videos</a><a class="chakra-link css-1807wg8" href="/about">About</a><a target="_blank" class="chakra-link css-1807wg8" href="https://youtube.com/theroadmap?sub_confirmation=1">YouTube</a></div><style data-emotion="css 1ehdw1x">.css-1ehdw1x{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;color:var(--chakra-colors-gray-400);font-weight:600;}.css-1ehdw1x>*:not(style)~*:not(style){margin-top:0px;-webkit-margin-end:0px;margin-inline-end:0px;margin-bottom:0px;-webkit-margin-start:0px;margin-inline-start:0px;}@media screen and (min-width: 30em){.css-1ehdw1x{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}@media screen and (min-width: 48em){.css-1ehdw1x{display:none;}}</style><div class="chakra-stack css-1ehdw1x"><style data-emotion="css vsan9l">.css-vsan9l{transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-fast);transition-timing-function:var(--chakra-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:none;text-decoration:none;outline:2px solid transparent;outline-offset:2px;color:inherit;padding-top:7px;padding-bottom:7px;border-bottom-width:1px;border-bottom-color:var(--chakra-colors-gray-800);}.css-vsan9l:hover,.css-vsan9l[data-hover]{color:var(--chakra-colors-white);}.css-vsan9l:focus,.css-vsan9l[data-focus]{box-shadow:var(--chakra-shadows-outline);}</style><a class="chakra-link css-vsan9l" href="/roadmaps">Roadmaps</a><a class="chakra-link css-vsan9l" href="/guides">Guides</a><a class="chakra-link css-vsan9l" href="/watch">Videos</a><a class="chakra-link css-vsan9l" href="/thanks">Thanks</a><a class="chakra-link css-vsan9l" href="/about">About</a><style data-emotion="css ex4by1">.css-ex4by1{transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-fast);transition-timing-function:var(--chakra-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:none;text-decoration:none;outline:2px solid transparent;outline-offset:2px;color:inherit;padding-top:7px;padding-bottom:7px;}.css-ex4by1:hover,.css-ex4by1[data-hover]{color:var(--chakra-colors-white);}.css-ex4by1:focus,.css-ex4by1[data-focus]{box-shadow:var(--chakra-shadows-outline);}</style><a target="_blank" class="chakra-link css-ex4by1" href="https://youtube.com/theroadmap?sub_confirmation=1">YouTube</a></div><style data-emotion="css opw3zq">.css-opw3zq{margin-top:40px;margin-bottom:40px;max-width:500px;}@media screen and (min-width: 30em){.css-opw3zq{margin-top:40px;}}@media screen and (min-width: 48em){.css-opw3zq{margin-top:50px;}}</style><div class="css-opw3zq"><style data-emotion="css 1r78w6">.css-1r78w6{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:var(--chakra-colors-gray-400);}</style><div spacing="0" class="css-1r78w6"><style data-emotion="css 1cdtrts">.css-1cdtrts{transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-fast);transition-timing-function:var(--chakra-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:none;text-decoration:none;outline:2px solid transparent;outline-offset:2px;color:inherit;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-weight:600;}.css-1cdtrts:hover,.css-1cdtrts[data-hover]{-webkit-text-decoration:none;text-decoration:none;color:var(--chakra-colors-white);}.css-1cdtrts:focus,.css-1cdtrts[data-focus]{box-shadow:var(--chakra-shadows-outline);}</style><a class="chakra-link css-1cdtrts" href="/"><style data-emotion="css 1l24g6b">.css-1l24g6b{height:25px;width:25px;margin-right:6px;}</style><img alt="" src="/logo.svg" class="chakra-image css-1l24g6b"/>roadmap.sh</a><style data-emotion="css qh3ecy">.css-qh3ecy{-webkit-margin-start:7px;margin-inline-start:7px;-webkit-margin-end:7px;margin-inline-end:7px;}</style><span class="chakra-text css-qh3ecy">by</span><style data-emotion="css 1svda2y">.css-1svda2y{transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-fast);transition-timing-function:var(--chakra-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:none;text-decoration:none;outline:2px solid transparent;outline-offset:2px;color:var(--chakra-colors-white);background:var(--chakra-colors-blue-500);-webkit-padding-start:6px;padding-inline-start:6px;-webkit-padding-end:6px;padding-inline-end:6px;padding-top:2px;padding-bottom:2px;border-radius:4px;font-weight:600;font-size:13px;}.css-1svda2y:hover,.css-1svda2y[data-hover]{-webkit-text-decoration:none;text-decoration:none;background:var(--chakra-colors-blue-600);}.css-1svda2y:focus,.css-1svda2y[data-focus]{box-shadow:var(--chakra-shadows-outline);}</style><a target="_blank" class="chakra-link css-1svda2y" href="https://twitter.com/kamranahmedse">@kamranahmedse</a></div><style data-emotion="css gp4krv">.css-gp4krv{margin-top:15px;margin-bottom:15px;font-size:14px;color:var(--chakra-colors-gray-500);}</style><p class="chakra-text css-gp4krv">Community created roadmaps, articles, resources and journeys to help you choose your path and grow in your career.</p><style data-emotion="css 1vf9ext">.css-1vf9ext{font-size:14px;color:var(--chakra-colors-gray-500);}</style><p class="chakra-text css-1vf9ext"><style data-emotion="css lvyu5j">.css-lvyu5j{margin-right:10px;}</style><span class="chakra-text css-lvyu5j">© roadmap.sh</span>·<style data-emotion="css q9uhdd">.css-q9uhdd{transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-fast);transition-timing-function:var(--chakra-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:none;text-decoration:none;outline:2px solid transparent;outline-offset:2px;color:var(--chakra-colors-gray-400);-webkit-margin-start:10px;margin-inline-start:10px;-webkit-margin-end:10px;margin-inline-end:10px;}.css-q9uhdd:hover,.css-q9uhdd[data-hover]{-webkit-text-decoration:none;text-decoration:none;color:var(--chakra-colors-white);}.css-q9uhdd:focus,.css-q9uhdd[data-focus]{box-shadow:var(--chakra-shadows-outline);}</style><a class="chakra-link css-q9uhdd" href="/about">FAQs</a>·<a class="chakra-link css-q9uhdd" href="/terms">Terms</a>·<a class="chakra-link css-q9uhdd" href="/privacy">Privacy</a></p></div></div></div></div><span></span></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"guide":{"id":"http-caching","title":"HTTP Caching","description":"Everything you need to know about web caching","isPro":false,"authorUsername":"kamranahmedse","createdAt":"2018-11-29T17:00:00.860Z","updatedAt":"2018-11-29T17:00:00.860Z","formattedCreatedAt":"November 29, 2018","formattedUpdatedAt":"November 29, 2018","author":{"username":"kamranahmedse","name":"Kamran Ahmed","twitter":"kamranahmedse","picture":"/authors/kamranahmedse.jpeg","bio":"Lead engineer at Tajawal. Lover of all things web and opensource. Created roadmap.sh to help the confused ones."}}},"__N_SSG":true},"page":"/guides/[guide]","query":{"guide":"http-caching"},"buildId":"ooSnr_WJpF8nzY9n_DSAx","isFallback":false,"gsp":true,"scriptLoader":[]}</script></body></html> |