{"id":5482,"date":"2026-01-06T15:24:31","date_gmt":"2026-01-06T23:24:31","guid":{"rendered":"https:\/\/www.sslshopper.com\/website-monitoring\/?p=5482"},"modified":"2026-01-06T15:24:34","modified_gmt":"2026-01-06T23:24:34","slug":"http-monitoring-explained","status":"publish","type":"post","link":"https:\/\/www.sslshopper.com\/website-monitoring\/http-monitoring-explained\/","title":{"rendered":"HTTP Monitoring Explained: Status Codes, Redirects, False Downtime"},"content":{"rendered":"\n<p><strong><mark style=\"background-color:var(--base)\" class=\"has-inline-color has-contrast-3-color\">[1,213 words, 6 minute read time]<\/mark><\/strong><\/p>\n\n\n\n<p>HTTP monitoring is the backbone of modern website uptime monitoring because it checks your site the way the web actually works: by requesting a URL over <strong>HTTP\/HTTPS<\/strong> and evaluating the response.<\/p>\n\n\n\n<p>But it also creates one of the most common frustrations in monitoring: <strong>\u201cIt says we\u2019re down\u2026 but the site looks fine.\u201d<\/strong><\/p>\n\n\n\n<p>Here\u2019s the truth: <strong>most \u201cdown\u201d alerts are configuration issues or edge cases<\/strong>\u2014redirects, bot protection, timeouts, TLS hiccups, or a \u201c200 OK\u201d page that isn\u2019t the page you meant to monitor.<\/p>\n\n\n\n<p>This guide explains how <strong>HTTP monitoring<\/strong> works, how to interpret results, and how to configure checks so alerts reflect real user impact.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">How HTTP checks work (GET vs HEAD, redirects, and TLS)<\/h2>\n\n\n\n<p>At a high level, an HTTP monitor:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Connects to your target URL<\/li>\n\n\n\n<li>Makes a request (often GET or HEAD)<\/li>\n\n\n\n<li>Follows any redirects (depending on settings)<\/li>\n\n\n\n<li>Evaluates the response (status code, response time, optionally content)<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">GET vs HEAD (what\u2019s the difference?)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>GET<\/strong> requests the page content (HTML\/JSON\/etc.).\n<ul class=\"wp-block-list\">\n<li>Best when you want to confirm the page really loads and contains expected content.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>HEAD<\/strong> requests only headers (no body).\n<ul class=\"wp-block-list\">\n<li>Often faster and lighter, but you can\u2019t do content\/keyword validation.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p><strong>Practical rule:<\/strong><br>If your tool offers it, use <strong>GET<\/strong> for critical pages (especially if you\u2019ll do keyword checks).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Redirect handling (301\/302 and beyond)<\/h3>\n\n\n\n<p>Many sites redirect:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>HTTP \u2192 HTTPS<\/li>\n\n\n\n<li>non-www \u2192 www (or the reverse)<\/li>\n\n\n\n<li>\/home \u2192 \/<\/li>\n\n\n\n<li>geo-based redirects<\/li>\n<\/ul>\n\n\n\n<p>Most monitors can follow redirects, but you should:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>confirm the monitor is pointing at the <strong>final canonical URL<\/strong><\/li>\n\n\n\n<li>ensure redirect chains are not excessive (more on that below)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">TLS\/HTTPS (why certificates matter)<\/h3>\n\n\n\n<p>For HTTPS monitoring, there\u2019s an extra step before any HTTP response exists: <strong>the TLS handshake<\/strong>.<\/p>\n\n\n\n<p>If TLS fails, the site can be \u201cdown\u201d to users even if the server is running. Causes include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>expired certificate<\/li>\n\n\n\n<li>hostname mismatch<\/li>\n\n\n\n<li>incomplete certificate chain<\/li>\n\n\n\n<li>unsupported TLS configuration for certain clients<\/li>\n<\/ul>\n\n\n\n<p>This is why an HTTPS monitor can alert even when \u201cthe server is up.\u201d<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Status codes cheat sheet: what to alert on (and what not to)<\/h2>\n\n\n\n<p>Status codes are the fastest way to interpret HTTP monitoring results.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2xx \u2014 Success<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>200 OK<\/strong>: the page responded successfully<\/li>\n\n\n\n<li><strong>204 No Content<\/strong>: often fine for APIs<br><strong>Usually:<\/strong> don\u2019t alert<\/li>\n<\/ul>\n\n\n\n<p><strong>But watch out:<\/strong> 200 can still be \u201cwrong content\u201d (keyword checks help).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3xx \u2014 Redirects<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>301 Moved Permanently<\/strong>: standard canonical redirect<\/li>\n\n\n\n<li><strong>302\/307 Temporary Redirect<\/strong>: common for login flows or experiments<\/li>\n<\/ul>\n\n\n\n<p><strong>Usually:<\/strong> don\u2019t alert if redirects are expected and the final page loads<br><strong>Do alert if:<\/strong> redirects loop, chain excessively, or point somewhere incorrect (like a login page).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4xx \u2014 Client-side errors (often \u201cblocked\u201d or \u201cnot found\u201d)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>401 Unauthorized<\/strong>: requires auth<\/li>\n\n\n\n<li><strong>403 Forbidden<\/strong>: blocked by WAF\/bot protection, permissions issue<\/li>\n\n\n\n<li><strong>404 Not Found<\/strong>: page missing<\/li>\n\n\n\n<li><strong>429 Too Many Requests<\/strong>: rate limiting<\/li>\n<\/ul>\n\n\n\n<p><strong>Alert depends on context:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>If it\u2019s a public page, <strong>403\/404<\/strong> is usually a real incident.<\/li>\n\n\n\n<li>If it\u2019s a protected endpoint, 401 might be expected.<\/li>\n\n\n\n<li>429 could mean your monitor is being throttled.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">5xx \u2014 Server-side errors (usually alert-worthy)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>500 Internal Server Error<\/strong>: application error<\/li>\n\n\n\n<li><strong>502 Bad Gateway<\/strong>: upstream failure (load balancer\/app server)<\/li>\n\n\n\n<li><strong>503 Service Unavailable<\/strong>: overload, maintenance mode, dependency failure<\/li>\n\n\n\n<li><strong>504 Gateway Timeout<\/strong>: upstream timeout<\/li>\n<\/ul>\n\n\n\n<p><strong>Usually:<\/strong> alert on these, especially if confirmed by retries\/regions.<\/p>\n\n\n\n<p>If you\u2019re tuning alert policies and escalation, see <strong><a href=\"https:\/\/www.sslshopper.com\/website-monitoring\/uptime-alerts-best-practices\/\">alert best practices<\/a><\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Keyword checks: confirm the right content loaded (the \u201cis it working?\u201d upgrade)<\/h2>\n\n\n\n<p>A plain HTTP check can be fooled. It might get a 200 OK while the site is effectively broken.<\/p>\n\n\n\n<p>A <strong>keyword check<\/strong> solves this by confirming the response body contains something stable and expected\u2014like:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>your brand name in the header<\/li>\n\n\n\n<li>a specific element or text unique to the page<\/li>\n\n\n\n<li>a \u201cWelcome back\u201d phrase on a dashboard<\/li>\n\n\n\n<li>a product price label (careful with dynamic content)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">What keyword checks catch<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u201c200 but wrong page\u201d<\/strong> (maintenance page, login page, cached error page)<\/li>\n\n\n\n<li>regional routing sending users to an unexpected version<\/li>\n\n\n\n<li>CMS template failures that render blank shells<\/li>\n\n\n\n<li>WAF returning a \u201cblocked\u201d page with 200<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">How to choose a good keyword<\/h3>\n\n\n\n<p>Good keywords are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>stable (won\u2019t change daily)<\/li>\n\n\n\n<li>specific (not \u201cHome\u201d or \u201cWelcome\u201d)<\/li>\n\n\n\n<li>unique to the correct page<\/li>\n\n\n\n<li>not user-personalized<\/li>\n<\/ul>\n\n\n\n<p><strong>Avoid:<\/strong> dynamic numbers, dates, rotating headlines, or personalized text.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Handling redirects and auth (without creating \u201cfalse downtime\u201d)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Redirects: point your monitor at the final destination<\/h3>\n\n\n\n<p>If your site redirects HTTP\u2192HTTPS or non-www\u2192www, configure your monitor to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>use the canonical URL (usually HTTPS)<\/li>\n\n\n\n<li>follow redirects (if needed)<\/li>\n\n\n\n<li>alert only if it can\u2019t reach the final page successfully<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Auth-protected pages: monitor what you can reliably validate<\/h3>\n\n\n\n<p>If the page requires login, you have three options:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Monitor the public page that indicates health (homepage, status endpoint, etc.)<\/li>\n\n\n\n<li>Use a keyword check on a semi-public page (like the login page itself)<\/li>\n\n\n\n<li>Use multi-step monitoring (login \u2192 dashboard) if your tool supports it<\/li>\n<\/ol>\n\n\n\n<p><strong>Common pitfall:<\/strong> monitoring a protected URL without proper config and getting 401\/403 alerts that aren\u2019t real incidents.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended settings (timeouts and retries that reduce noise)<\/h2>\n\n\n\n<p>Most false downtime alerts happen because monitors are too \u201ctwitchy.\u201d<\/p>\n\n\n\n<p>Here are safe defaults for many sites:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Practical defaults<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Interval:<\/strong> every 5 minutes (adjust later)<\/li>\n\n\n\n<li><strong>Timeout:<\/strong> 10 seconds<\/li>\n\n\n\n<li><strong>Retries:<\/strong> 2 (confirm before alerting)<\/li>\n\n\n\n<li><strong>Redirects:<\/strong> follow redirects (or monitor the canonical URL directly)<\/li>\n\n\n\n<li><strong>Regions:<\/strong> 1\u20132 to start; more as your audience broadens<\/li>\n<\/ul>\n\n\n\n<p>Want help deciding how aggressive to be? See <strong><a href=\"https:\/\/www.sslshopper.com\/website-monitoring\/uptime-check-frequency\/\">check frequency<\/a><\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Confirmation logic is your best friend<\/h3>\n\n\n\n<p>If your tool supports \u201cconfirm from another location\u201d or \u201conly alert after multiple failures,\u201d turn it on. It prevents:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>one-off network blips<\/li>\n\n\n\n<li>single-region probe issues<\/li>\n\n\n\n<li>transient DNS hiccups<\/li>\n<\/ul>\n\n\n\n<p>If you\u2019re currently getting spammed, fix it with <strong><a href=\"https:\/\/www.sslshopper.com\/website-monitoring\/reduce-false-positives-uptime-monitoring\/\">false positives<\/a><\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Three common \u201cdown alert\u201d edge cases (and how to fix them)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Example 1: \u201c200 but wrong page\u201d<\/h3>\n\n\n\n<p><strong>Symptoms:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Monitor shows 200 OK<\/li>\n\n\n\n<li>Keyword check fails (or users report issues)<br><strong>Causes:<\/strong><\/li>\n\n\n\n<li>maintenance page returning 200<\/li>\n\n\n\n<li>cached error page<\/li>\n\n\n\n<li>unexpected redirect to login or geo page<br><strong>Fix:<\/strong><\/li>\n\n\n\n<li>add a keyword check on a stable page element<\/li>\n\n\n\n<li>monitor the canonical URL and confirm final destination<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Example 2: \u201c301 chain\u201d<\/h3>\n\n\n\n<p><strong>Symptoms:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Monitor reports excessive redirects, timeout, or redirect loop<br><strong>Causes:<\/strong><\/li>\n\n\n\n<li>HTTP\u2192HTTPS redirect plus www\/non-www plus trailing slash rules<\/li>\n\n\n\n<li>misconfigured rewrite rules<br><strong>Fix:<\/strong><\/li>\n\n\n\n<li>point monitor at the final canonical URL (usually HTTPS + correct host)<\/li>\n\n\n\n<li>reduce redirect hops; avoid loops<\/li>\n\n\n\n<li>confirm your tool follows redirects correctly<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Example 3: \u201c403 from bot protection\u201d<\/h3>\n\n\n\n<p><strong>Symptoms:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Monitor reports 403 (or sometimes 200 with a \u201cblocked\u201d page)<\/li>\n\n\n\n<li>Real users can load the site<br><strong>Causes:<\/strong><\/li>\n\n\n\n<li>WAF\/bot protection blocking monitoring probes<\/li>\n\n\n\n<li>rate limiting triggers (429)<br><strong>Fix:<\/strong><\/li>\n\n\n\n<li>allowlist monitoring IP ranges (if available)<\/li>\n\n\n\n<li>adjust WAF rules for your monitor user-agent\/behavior<\/li>\n\n\n\n<li>reduce <a href=\"https:\/\/www.sslshopper.com\/website-monitoring\/uptime-check-frequency\/\">check frequency<\/a> if you\u2019re being throttled<\/li>\n\n\n\n<li>use keyword checks to detect \u201cblocked page\u201d responses even if they return 200<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Troubleshooting flow: what to do when an HTTP monitor alerts<\/h2>\n\n\n\n<p>When you get an alert, ask:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>What status code is it?<\/strong> (5xx vs 4xx vs timeout)<\/li>\n\n\n\n<li><strong>Is it confirmed by retries and\/or multiple regions?<\/strong><\/li>\n\n\n\n<li><strong>Is it a redirect issue?<\/strong> (loop or chain)<\/li>\n\n\n\n<li><strong>Could it be bot protection?<\/strong> (403\/429)<\/li>\n\n\n\n<li><strong>Could it be \u201cwrong content with 200\u201d?<\/strong> (use keyword checks)<\/li>\n<\/ol>\n\n\n\n<p>This flow alone resolves a large percentage of \u201cmystery downtime\u201d alerts.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Add one keyword check to your most important page (CTA)<\/h2>\n\n\n\n<p>If you do one thing to make HTTP monitoring more reliable, do this:<\/p>\n\n\n\n<p><strong>Add a keyword check to your most important page<\/strong> (the page tied to revenue, signups, or leads).<\/p>\n\n\n\n<p>It\u2019s the fastest upgrade from \u201cis up\u201d to \u201cis working,\u201d and it eliminates a big chunk of confusing edge cases.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>[1,213 words, 6 minute read time] HTTP monitoring is the backbone of modern website uptime monitoring because it checks your site the way the web actually works: by requesting a URL over HTTP\/HTTPS and evaluating the response. But it also creates one of the most common frustrations in monitoring: \u201cIt says we\u2019re down\u2026 but the &#8230; <a title=\"HTTP Monitoring Explained: Status Codes, Redirects, False Downtime\" class=\"read-more\" href=\"https:\/\/www.sslshopper.com\/website-monitoring\/http-monitoring-explained\/\" aria-label=\"Read more about HTTP Monitoring Explained: Status Codes, Redirects, False Downtime\">Read more<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[108],"tags":[],"class_list":["post-5482","post","type-post","status-publish","format-standard","hentry","category-guides"],"_links":{"self":[{"href":"https:\/\/www.sslshopper.com\/website-monitoring\/wp-json\/wp\/v2\/posts\/5482","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sslshopper.com\/website-monitoring\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sslshopper.com\/website-monitoring\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sslshopper.com\/website-monitoring\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sslshopper.com\/website-monitoring\/wp-json\/wp\/v2\/comments?post=5482"}],"version-history":[{"count":2,"href":"https:\/\/www.sslshopper.com\/website-monitoring\/wp-json\/wp\/v2\/posts\/5482\/revisions"}],"predecessor-version":[{"id":5549,"href":"https:\/\/www.sslshopper.com\/website-monitoring\/wp-json\/wp\/v2\/posts\/5482\/revisions\/5549"}],"wp:attachment":[{"href":"https:\/\/www.sslshopper.com\/website-monitoring\/wp-json\/wp\/v2\/media?parent=5482"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sslshopper.com\/website-monitoring\/wp-json\/wp\/v2\/categories?post=5482"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sslshopper.com\/website-monitoring\/wp-json\/wp\/v2\/tags?post=5482"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}