Redirect checker
See where a link really ends up, and whether every redirect on the way is the right kind.
Results for http://github.com/
200 OK
Lands safely after 1 redirect
http://github.com/ takes 1 redirect to settle on https://github.com/ — and moves to HTTPS along the way.
Slowest hop: #2 (20 ms)
- 1301 Moved Permanentlyhttp://github.com/→ Redirects to https://github.com/12 ms
- 2200 OKUpgraded to HTTPShttps://github.com/20 ms · slowest
2 hops: 301 → 200.
5 of 6 checks pass
Caches must revalidate before reuse (a validator is present, so a 304 is possible).
- 1 of 3 cookies lack recommended flags (Secure, HttpOnly, SameSite); see the cookies list.
Response headers20
| Header | Value |
|---|---|
date | Sat, 14 Nov 2026 17:54:21 GMT |
content-type | text/html; charset=utf-8 |
vary | X-PJAX, X-PJAX-Container, Turbo-Visit, Turbo-Frame, X-Requested-With, X-GitHub-Client-Version, Accept-Language, Sec-Fetch-Site,Accept-Encoding, Accept, X-Requested-With |
content-language | en-US |
etag | W/"5cabf5a3489aa58eb8550c12094d2e31" |
cache-control | max-age=0, private, must-revalidate |
strict-transport-security | max-age=31536000; includeSubdomains; preload |
x-frame-options | deny |
x-content-type-options | nosniff |
x-xss-protection | 0 |
referrer-policy | origin-when-cross-origin, strict-origin-when-cross-origin |
content-security-policy | default-src 'none'; base-uri 'self'; child-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/; connect-src 'self' uploads.github.com www.githubstatus.com collector.github.com raw.githubusercontent.com api.github.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com *.rel.tunnels.api.visualstudio.com wss://*.rel.tunnels.api.visualstudio.com github.githubassets.com objects-origin.githubusercontent.com copilot-proxy.githubusercontent.com proxy.individual.githubcopilot.com proxy.business.githubcopilot.com proxy.enterprise.githubcopilot.com *.actions.githubusercontent.com wss://*.actions.githubusercontent.com productionresultssa0.blob.core.windows.net productionresultssa1.blob.core.windows.net productionresultssa2.blob.core.windows.net productionresultssa3.blob.core.windows.net productionresultssa4.blob.core.windows.net productionresultssa5.blob.core.windows.net productionresultssa6.blob.core.windows.net productionresultssa7.blob.core.windows.net productionresultssa8.blob.core.windows.net productionresultssa9.blob.core.windows.net productionresultssa10.blob.core.windows.net productionresultssa11.blob.core.windows.net productionresultssa12.blob.core.windows.net productionresultssa13.blob.core.windows.net productionresultssa14.blob.core.windows.net productionresultssa15.blob.core.windows.net productionresultssa16.blob.core.windows.net productionresultssa17.blob.core.windows.net productionresultssa18.blob.core.windows.net productionresultssa19.blob.core.windows.net productionresultssa30.blob.core.windows.net productionresultssa31.blob.core.windows.net productionresultssa32.blob.core.windows.net github-production-repository-image-32fea6.s3.amazonaws.com github-production-release-asset-2e65be.s3.amazonaws.com insights.github.com wss://alive.github.com wss://alive-… |
server | github.com |
content-encoding | gzip |
accept-ranges | bytes |
set-cookie | _gh_sess=itcR7l%2F7Z27qkud5BP%2Fs%2Ffnn09C7qjGOr1NCAbeE5myiYtvlEMx5bn49Tn1OJyfki3sGL028CzCBxew3i25Eefe8OT8HlQ9fSRpkr75Nmr5oBkmvUnPZ2HOnwk3G2BMIQ3gS1SStWC2JSj65fbAI5TRHBeeHrhWa6zuR%2Bx46bh7q3xyX%2FABTrwQmBVLXQJqge%2F2YOG6DHEFYd8TWpwmyUqvixfZUbJcVFPP7l%2B%2Bz7tBCZKxJr8HqsWPmDnyQt9KmuEUSKozT68L3k321PsTzAg%3D%3D--sZ37o9hh%2Bor4SOq7--MB4yzaPBogDyHRlUYsBDmg%3D%3D; path=/; HttpOnly; secure; SameSite=Lax _octo=GH1.1.270407899.1794678868; expires=Sun, 14 Nov 2027 17:54:28 GMT; domain=.github.com; path=/; secure; SameSite=Lax logged_in=no; expires=Sun, 14 Nov 2027 17:54:28 GMT; domain=.github.com; path=/; HttpOnly; secure; SameSite=Lax |
x-github-request-id | 9F0A:29FE65:6487BF8:8E98EBC:6AF8A054 |
x-github-edge-region | fra |
connection | close |
transfer-encoding | chunked |
Headers of hop 1 · 301 · 3
| Header | Value |
|---|---|
content-length | 0 |
location | https://github.com/ |
connection | close |
Security6
These six headers tell browsers how to treat the page. A missing one is a chance to tighten things up, not a fault in itself. Score: 95 out of 100.
| Header | Rating | Value | What it means |
|---|---|---|---|
Strict-Transport-Security | Good | max-age=31536000; includeSubdomains; preload | HSTS is enabled for 365 days. includeSubDomains and preload are set: the site can be added to browsers' preload lists. |
Content-Security-Policy | Good | default-src 'none'; base-uri 'self'; child-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/; connect-src 'self' uploads.github.com www.githubstatus.com collector.github.com raw.githubusercontent.com api.github.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-… | A Content-Security-Policy restricts script sources. |
X-Frame-Options | Good | deny | Framing is limited (DENY), which blocks clickjacking. |
X-Content-Type-Options | Good | nosniff | MIME sniffing is disabled. |
Referrer-Policy | Good | origin-when-cross-origin, strict-origin-when-cross-origin | strict-origin-when-cross-origin keeps full URLs from leaking to other sites. |
Permissions-Policy | Missing | – | No Permissions-Policy: powerful browser features stay available to any embedded content. |
Caching
Caches must revalidate before reuse (a validator is present, so a 304 is possible).
- Cache-Control
max-age=0, private, must-revalidate- Browsers keep it for
- 0 s
- ETag
- ✓ Yes
- Vary
X-PJAX, X-PJAX-Container, Turbo-Visit, Turbo-Frame, X-Requested-With, X-GitHub-Client-Version, Accept-Language, Sec-Fetch-Site,Accept-Encoding, Accept, X-Requested-With
Cookies3
| Name | Secure | HttpOnly | SameSite | Lasts | Worth a look |
|---|---|---|---|---|---|
_gh_sess | ✓ Yes | ✓ Yes | lax | This visit | – |
_octo | ✓ Yes | – No | lax | Persistent | missing HttpOnly: scripts on the page can read it |
logged_in | ✓ Yes | ✓ Yes | lax | Persistent | – |
Server
- Software
- github.com
- Content type
text/html; charset=utf-8- Compression
gzip- Language
en-US
Structured result (JSON) · 11 KB
{
"url": "http://github.com/",
"method": "GET",
"finalUrl": "https://github.com/",
"status": 200,
"ok": true,
"hops": [
{
"url": "http://github.com/",
"status": 301,
"headers": {
"content-length": "0",
"location": "https://github.com/",
"connection": "close"
},
"ms": 12,
"statusText": "Moved Permanently",
"location": "https://github.com/",
"ip": "140.82.121.4",
"httpVersion": "1.1"
},
{
"url": "https://github.com/",
"status": 200,
"headers": {
"date": "Sat, 14 Nov 2026 17:54:21 GMT",
"content-type": "text/html; charset=utf-8",
"vary": "X-PJAX, X-PJAX-Container, Turbo-Visit, Turbo-Frame, X-Requested-With, X-GitHub-Client-Version, Accept-Language, Sec-Fetch-Site,Accept-Encoding, Accept, X-Requested-With",
"content-language": "en-US",
"etag": "W/\"5cabf5a3489aa58eb8550c12094d2e31\"",
"cache-control": "max-age=0, private, must-revalidate",
"strict-transport-security": "max-age=31536000; includeSubdomains; preload",
"x-frame-options": "deny",
"x-content-type-options": "nosniff",
"x-xss-protection": "0",
"referrer-policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
"content-security-policy": "default-src 'none'; base-uri 'self'; child-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/; connect-src 'self' uploads.github.com www.githubstatus.com collector.github.com raw.githubusercontent.com api.github.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com *.rel.tunnels.api.visualstudio.com wss://*.rel.tunnels.api.visualstudio.com github.githubassets.com objects-origin.githubusercontent.com copilot-proxy.githubusercontent.com proxy.individual.githubcopilot.com proxy.business.githubcopilot.com proxy.enterprise.githubcopilot.com *.actions.githubusercontent.com wss://*.actions.githubusercontent.com productionresultssa0.blob.core.windows.net productionresultssa1.blob.core.windows.net productionresultssa2.blob.core.windows.net productionresultssa3.blob.core.windows.net productionresultssa4.blob.core.windows.net productionresultssa5.blob.core.windows.net productionresultssa6.blob.core.windows.net productionresultssa7.blob.core.windows.net productionresultssa8.blob.core.windows.net productionresultssa9.blob.core.windows.net productionresultssa10.blob.core.windows.net productionresultssa11.blob.core.windows.net productionresultssa12.blob.core.windows.net productionresultssa13.blob.core.windows.net productionresultssa14.blob.core.windows.net productionresultssa15.blob.core.windows.net productionresultssa16.blob.core.windows.net productionresultssa17.blob.core.windows.net productionresultssa18.blob.core.windows.net productionresultssa19.blob.core.windows.net productionresultssa30.blob.core.windows.net productionresultssa31.blob.core.windows.net productionresultssa32.blob.core.windows.net github-production-repository-image-32fea6.s3.amazonaws.com github-production-release-asset-2e65be.s3.amazonaws.com insights.github.com wss://alive.github.com wss://alive-staging.github.com api.githubcopilot.com api.individual.githubcopilot.com api.business.githubcopilot.com api.enterprise.githubcopilot.com wss://production-copilot-host.webpubsub.azure.com wss://production-copilot-host-centralus.webpubsub.azure.com wss://production-copilot-host-centralus-02.webpubsub.azure.com wss://production-copilot-host-westus.webpubsub.azure.com wss://production-copilot-host-westus3.webpubsub.azure.com wss://production-copilot-host-eastasia.webpubsub.azure.com wss://production-copilot-host-austriaeast.webpubsub.azure.com api.github.com/cmc_internal/api/ edge.fullstory.com rs.fullstory.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com copilot-workspace.githubnext.com objects-origin.githubusercontent.com; frame-ancestors 'none'; frame-src viewscreen.githubusercontent.com notebooks.githubusercontent.com www.youtube-nocookie.com; img-src 'self' data: blob: github.githubassets.com media.githubusercontent.com camo.githubusercontent.com identicons.github.com avatars.githubusercontent.com private-avatars.githubusercontent.com github-cloud.s3.amazonaws.com objects.githubusercontent.com release-assets.githubusercontent.com secured-user-images.githubusercontent.com user-images.githubusercontent.com private-user-images.githubusercontent.com opengraph.githubassets.com repository-images.githubusercontent.com marketplace-screenshots.githubusercontent.com copilotprodattachments.blob.core.windows.net/github-production-copilot-attachments/ github-production-user-asset-6210df.s3.amazonaws.com customer-stories-feed.github.com spotlights-feed.github.com explore-feed.github.com *.googleusercontent.com objects-origin.githubusercontent.com *.githubusercontent.com images.ctfassets.net/8aevphvgewt8/; manifest-src 'self'; media-src github.com user-images.githubusercontent.com secured-user-images.githubusercontent.com private-user-images.githubusercontent.com github-production-user-asset-6210df.s3.amazonaws.com gist.github.com github.github…",
"server": "github.com",
"content-encoding": "gzip",
"accept-ranges": "bytes",
"set-cookie": "_gh_sess=itcR7l%2F7Z27qkud5BP%2Fs%2Ffnn09C7qjGOr1NCAbeE5myiYtvlEMx5bn49Tn1OJyfki3sGL028CzCBxew3i25Eefe8OT8HlQ9fSRpkr75Nmr5oBkmvUnPZ2HOnwk3G2BMIQ3gS1SStWC2JSj65fbAI5TRHBeeHrhWa6zuR%2Bx46bh7q3xyX%2FABTrwQmBVLXQJqge%2F2YOG6DHEFYd8TWpwmyUqvixfZUbJcVFPP7l%2B%2Bz7tBCZKxJr8HqsWPmDnyQt9KmuEUSKozT68L3k321PsTzAg%3D%3D--sZ37o9hh%2Bor4SOq7--MB4yzaPBogDyHRlUYsBDmg%3D%3D; path=/; HttpOnly; secure; SameSite=Lax\n_octo=GH1.1.270407899.1794678868; expires=Sun, 14 Nov 2027 17:54:28 GMT; domain=.github.com; path=/; secure; SameSite=Lax\nlogged_in=no; expires=Sun, 14 Nov 2027 17:54:28 GMT; domain=.github.com; path=/; HttpOnly; secure; SameSite=Lax",
"x-github-request-id": "9F0A:29FE65:6487BF8:8E98EBC:6AF8A054",
"x-github-edge-region": "fra",
"connection": "close",
"transfer-encoding": "chunked"
},
"ms": 20,
"statusText": "OK",
"ip": "140.82.121.4",
"httpVersion": "1.1"
}
],
"totalMs": 32,
"redirects": {
"count": 1,
"loop": false,
"tooMany": false,
"notFollowed": false,
"httpsUpgrade": true,
"downgrade": false,
"crossDomain": false,
"chain": [
{
"from": "http://github.com/",
"to": "https://github.com/",
"status": 301
}
]
},
"security": {
"score": 95,
"grade": "A",
"checks": [
{
"id": "hsts",
"header": "Strict-Transport-Security",
"weight": 25,
"present": true,
"value": "max-age=31536000; includeSubdomains; preload",
"rating": "good",
"message": "HSTS is enabled for 365 days. includeSubDomains and preload are set: the site can be added to browsers' preload lists."
},
{
"id": "csp",
"header": "Content-Security-Policy",
"weight": 30,
"present": true,
"value": "default-src 'none'; base-uri 'self'; child-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/; connect-src 'self' uploads.github.com www.githubstatus.com collector.github.com raw.githubusercontent.com api.github.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com *.rel.tunnels.api.visualstudio.com wss://*.rel.tunnels.api.visualstudio.com github.githubassets.com objects-origin.gith…",
"rating": "good",
"message": "A Content-Security-Policy restricts script sources."
},
{
"id": "frame-options",
"header": "X-Frame-Options",
"weight": 15,
"present": true,
"value": "deny",
"rating": "good",
"message": "Framing is limited (DENY), which blocks clickjacking."
},
{
"id": "content-type-options",
"header": "X-Content-Type-Options",
"weight": 15,
"present": true,
"value": "nosniff",
"rating": "good",
"message": "MIME sniffing is disabled."
},
{
"id": "referrer-policy",
"header": "Referrer-Policy",
"weight": 10,
"present": true,
"value": "origin-when-cross-origin, strict-origin-when-cross-origin",
"rating": "good",
"message": "strict-origin-when-cross-origin keeps full URLs from leaking to other sites."
},
{
"id": "permissions-policy",
"header": "Permissions-Policy",
"weight": 5,
"present": false,
"rating": "missing",
"message": "No Permissions-Policy: powerful browser features stay available to any embedded content."
}
]
},
"caching": {
"noStore": false,
"noCache": false,
"private": true,
"public": false,
"immutable": false,
"mustRevalidate": true,
"cacheability": "revalidate",
"summary": "Caches must revalidate before reuse (a validator is present, so a 304 is possible).",
"cacheControl": "max-age=0, private, must-revalidate",
"maxAge": 0,
"etag": true,
"vary": "X-PJAX, X-PJAX-Container, Turbo-Visit, Turbo-Frame, X-Requested-With, X-GitHub-Client-Version, Accept-Language, Sec-Fetch-Site,Accept-Encoding, Accept, X-Requested-With"
},
"cookies": [
{
"name": "_gh_sess",
"secure": true,
"httpOnly": true,
"persistent": false,
"issues": [],
"path": "/",
"sameSite": "lax"
},
{
"name": "_octo",
"secure": true,
"httpOnly": false,
"persistent": true,
"issues": [
"missing HttpOnly: scripts on the page can read it"
],
"domain": ".github.com",
"path": "/",
"sameSite": "lax"
},
{
"name": "logged_in",
"secure": true,
"httpOnly": true,
"persistent": true,
"issues": [],
"domain": ".github.com",
"path": "/",
"sameSite": "lax"
}
],
"server": {
"versionDisclosed": false,
"software": "github.com"
},
"content": {
"type": "text/html; charset=utf-8",
"encoding": "gzip",
"language": "en-US"
},
"issues": [
{
"severity": "warning",
"code": "COOKIE_FLAGS",
"message": "1 of 3 cookies lack recommended flags (Secure, HttpOnly, SameSite); see the cookies list."
}
],
"notes": [],
"statusText": "OK"
}What a redirect checker shows
A redirect is a server telling the browser to go to a different address. Changing http to https, www to the bare domain, or an old page to a new one are all redirects, and each one adds a round trip before the page can load. This page follows the whole chain and lists every hop with its status code, the Location it points to and how long it took. You see where a link really ends up and whether the route is clean.
The status code tells you whether a move is permanent or temporary, and whether the request method (GET or POST) survives it.
| Status | Meaning | Typical use |
|---|---|---|
301 | Moved permanently | Domain or URL moves, and HTTP to HTTPS. Browsers and search engines remember it. |
308 | Moved permanently, method kept | Like 301, but a POST stays a POST. |
302 | Found (temporary) | Short-term moves, A/B tests and login flows. |
303 | See other | After a form POST, go and GET another page. |
307 | Temporary, method kept | Like 302, but the method can't change. |
How to use it
- Enter the starting URLUse the exact address you want to test. Include
http://if you are checking the step from HTTP to HTTPS, because a bare hostname is tried over HTTPS first. - Read the journeyThe hops run from top to bottom, each with a status code. The last one should be a 2xx, which is the final page. A 4xx or 5xx there means the chain ends in an error. The headline sums it up, for example “Lands safely after 2 redirects” or “Caught in a redirect loop”. To see only the first response, switch off redirect following under More options.
- Fix what you findAim for one redirect at most. Update links, canonical tags (the tags that name a page's preferred address) and sitemaps to point straight at the final URL.
What a good chain looks like
- One redirect at most.
http://example.com/should go straight tohttps://example.com/(or your preferred host), not through three other URLs. - Permanent moves use 301 or 308. A 302 on a move that will never be undone can leave search engines holding on to the old URL.
- One main host. Pick
example.comorwww.example.comand redirect the other to it, over both HTTP and HTTPS. - The same path. A redirect should keep the path and query string, and not drop everyone on the home page.
- HSTS note. HSTS is a header that tells browsers to use HTTPS only. If a site sends it and your browser has seen it, the browser upgrades
httptohttpsitself with an internal 307, so you won't see that hop in browser tools. The checker shows what a fresh visitor gets.
Redirect problems and fixes
- Redirect loop (ERR_TOO_MANY_REDIRECTS). URL A sends you to B and B sends you back. Common causes are HTTPS forced at both a CDN and the origin, conflicting
wwwrules, or a CMS address setting that disagrees with the web server. - Long chains.
http://example.comtohttps://example.comtohttps://www.example.comtohttps://www.example.com/en/is three redirects. Combine them into one rule. - HTTPS downgrade. A redirect from
httpstohttpis a security problem, because the visitor's traffic can be read or changed in transit. - The wrong status. Temporary redirects (302 or 307) on permanent moves slow down the search engine's switch to the new URL.
- Redirects to the home page. Sending every old URL to
/can be treated as a soft 404, a page that looks missing to search engines. Map each page to its closest match. - Lost parameters. A rule may drop tracking or filter parameters. Compare the start URL with the final one.
- A different result for crawlers. Some sites redirect by user agent or country. This tool uses a neutral client from a datacentre.
How it works and the standards
LookupOwl requests the URL, reads the status and Location header, works out the next URL relative to the current one, and repeats, for at most 10 hops. Each new host is checked again, so a redirect can't lead the tool to a private or internal address. The result flags loops, a chain still redirecting after 10 hops, more than 3 redirects, an upgrade from HTTP to HTTPS, a downgrade from HTTPS to HTTP and hops that leave the original domain. The status codes are defined in RFC 9110 section 15.4. For the headers on each hop, use the HTTP headers checker.
curl -sIL -o /dev/null -w "%{url_effective} %{num_redirects} redirects\n" http://example.com
curl -sI http://example.com | head -n 5Questions people ask
What is the difference between a 301 and a 302 redirect?
A 301 says the move is permanent, so browsers and search engines should swap the old URL for the new one. A 302 says it is temporary, so they keep the original address and come back to it. Use 301 or 308 for moves you won't undo, such as a new domain or HTTP to HTTPS, and 302 or 307 for short-term detours.
How many redirects are too many?
Aim for one redirect at most, and treat more than three as too many. Browsers and search crawlers follow longer chains, but each redirect adds delay and a chance to fail, and Google gives up after about ten. This checker flags any chain of more than three redirects, which is a clear sign to merge the rules.
Do redirects hurt SEO?
Not when they are clean. A single 301 passes a page's signals to the new URL, and search engines treat it as the page's new home. Trouble starts with long chains, loops and temporary redirects used for permanent moves, because those slow down or confuse the switch. Keep redirects short, point them at the closest matching page and update your internal links.
Why does my redirect work in the browser but not here?
Because your browser isn't a fresh visitor. It caches 301s, applies HSTS and carries cookies, and sites may redirect by language or country. This checker starts clean from a datacentre address, so it sees what a first-time visitor gets. Also check whether the redirect is done in JavaScript or with a meta refresh tag, which this tool doesn't follow.
How do I stop a redirect loop?
Find the two rules that disagree and make one layer responsible. Common culprits are forced HTTPS at both a CDN (a network of caching servers in front of your site) and the origin server, www rules set in two places, and a CMS address setting that conflicts with the web server. Fix one rule, clear any cache, then run the check again.
Does it follow shortened links?
Yes, as long as they use HTTP redirects, which most link shorteners do. You can see where a short link ends up without opening it in your browser. It can't tell you whether the destination is safe, so treat unknown links with care and look at the final domain before you click.
Can it check a redirect that needs a login or a cookie?
No. The request is anonymous and doesn't send your cookies, so a redirect that depends on being signed in, or on a cookie, won't appear. Use curl with your cookie, or your browser's developer tools, for those. Anything the site does for an ordinary first-time visitor shows up here.
Use it from AI, the API or the command line
Every LookupOwl tool is also a free API and an MCP tool, with no key and no account. This one is http_headers. Please be kind to the rate limits.
curl "https://lookupowl.com/api/v1/tools/http-headers?q=https%3A%2F%2Fexample.com%2F"claude mcp add --transport http lookupowl https://lookupowl.com/mcp