Inspect redirect paths

Seven tested local HTTP examples, not a scan of your website. Source links and redirect responses are shown separately. No search engine or backlink index is queried.

Counts cover the displayed GET requests after the source page. The six-request bound belongs to this local teaching client, not to Googlebot. A terminal response can be an error; reaching 200 does not establish relevance.

R01 · Moved page has no mapping

Intended outcome
The former guide has a relevant replacement at /guide, but the old URL currently returns 404.
Proposed action
Add one permanent redirect to the declared replacement.
Acceptance check
The same old URL returns 301, then /guide returns 200 with the replacement guide.

Source page link · unchanged

GET /publisher/r1
HTTP 200
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Local source</title></head><body><h1>Source page</h1><a href="/r1/old-guide">Reference</a></body></html>

Before

Requests after the source page: 1 · Redirect responses: 0

GET /r1/old-guide
HTTP 404
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Unavailable</title></head><body><h1>Not available</h1></body></html>

Terminal response reached

After

Requests after the source page: 2 · Redirect responses: 1

GET /r1/old-guide
HTTP 301
Location: /guide
Cache-Control: no-store

GET /guide
HTTP 200
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Replacement guide</title></head><body><h1>Replacement guide</h1><p>Equivalent guide content for the declared mapping.</p></body></html>

Terminal response reached

R02 · Working chain takes an unnecessary detour

Intended outcome
The old guide reaches the correct document through /middle. The content works; the extra hop is avoidable.
Proposed action
Point the old URL directly at /guide while keeping any still-needed intermediate mapping.
Acceptance check
The path changes from three requests to two, with the same final guide and unchanged source link.

Source page link · unchanged

GET /publisher/r2
HTTP 200
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Local source</title></head><body><h1>Source page</h1><a href="/r2/old-guide">Reference</a></body></html>

Before

Requests after the source page: 3 · Redirect responses: 2

GET /r2/old-guide
HTTP 301
Location: /middle
Cache-Control: no-store

GET /middle
HTTP 301
Location: /guide
Cache-Control: no-store

GET /guide
HTTP 200
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Replacement guide</title></head><body><h1>Replacement guide</h1><p>Equivalent guide content for the declared mapping.</p></body></html>

Terminal response reached

After

Requests after the source page: 2 · Redirect responses: 1

GET /r2/old-guide
HTTP 301
Location: /guide
Cache-Control: no-store

GET /guide
HTTP 200
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Replacement guide</title></head><body><h1>Replacement guide</h1><p>Equivalent guide content for the declared mapping.</p></body></html>

Terminal response reached

R03 · Two URLs form a loop

Intended outcome
The old URL and /r3/loop send requests back to each other; no terminal content is reached.
Proposed action
Replace the old URL’s rule with a direct mapping to /guide.
Acceptance check
The repeated-path stop disappears and the two observed responses are 301 then 200.

Source page link · unchanged

GET /publisher/r3
HTTP 200
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Local source</title></head><body><h1>Source page</h1><a href="/r3/old-guide">Reference</a></body></html>

Before

Requests after the source page: 2 · Redirect responses: 2

GET /r3/old-guide
HTTP 301
Location: /r3/loop
Cache-Control: no-store

GET /r3/loop
HTTP 301
Location: /r3/old-guide
Cache-Control: no-store

Repeated URL: stopped before another request · /r3/old-guide

After

Requests after the source page: 2 · Redirect responses: 1

GET /r3/old-guide
HTTP 301
Location: /guide
Cache-Control: no-store

GET /guide
HTTP 200
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Replacement guide</title></head><body><h1>Replacement guide</h1><p>Equivalent guide content for the declared mapping.</p></body></html>

Terminal response reached

R04 · A successful homepage is the wrong destination

Intended outcome
The visitor expects a guide, but /home contains only general navigation. Both configurations end in 200.
Proposed action
Map to the relevant /guide, not an unrelated success page.
Acceptance check
Check the final path and body as well as status. This is not an observed Google soft-404 classification.

Source page link · unchanged

GET /publisher/r4
HTTP 200
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Local source</title></head><body><h1>Source page</h1><a href="/r4/old-guide">Reference</a></body></html>

Before

Requests after the source page: 2 · Redirect responses: 1

GET /r4/old-guide
HTTP 301
Location: /home
Cache-Control: no-store

GET /home
HTTP 200
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Home</title></head><body><h1>Home</h1><p>General navigation, no replacement guide.</p></body></html>

Terminal response reached

After

Requests after the source page: 2 · Redirect responses: 1

GET /r4/old-guide
HTTP 301
Location: /guide
Cache-Control: no-store

GET /guide
HTTP 200
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Replacement guide</title></head><body><h1>Replacement guide</h1><p>Equivalent guide content for the declared mapping.</p></body></html>

Terminal response reached

R05 · Removed content has no equivalent replacement

Intended outcome
The content is permanently removed; sending visitors to /home does not fulfil its purpose.
Proposed action
Return 410 for this declared removal and remove stale internal references.
Acceptance check
The old URL returns 410 with an unavailable page. No invented replacement or recovered ranking is claimed.

Source page link · unchanged

GET /publisher/r5
HTTP 200
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Local source</title></head><body><h1>Source page</h1><a href="/r5/old-guide">Reference</a></body></html>

Before

Requests after the source page: 2 · Redirect responses: 1

GET /r5/old-guide
HTTP 301
Location: /home
Cache-Control: no-store

GET /home
HTTP 200
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Home</title></head><body><h1>Home</h1><p>General navigation, no replacement guide.</p></body></html>

Terminal response reached

After

Requests after the source page: 1 · Redirect responses: 0

GET /r5/old-guide
HTTP 410
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Unavailable</title></head><body><h1>Not available</h1></body></html>

Terminal response reached

R06 · A temporary move was marked permanent

Intended outcome
The original service is expected to return; /holding is only a temporary notice.
Proposed action
Use the temporary 302 behavior for this GET example, with a plan to restore the original service.
Acceptance check
The same notice is reached through 302 rather than 301. Search processing and prior cached responses need separate checks.

Source page link · unchanged

GET /publisher/r6
HTTP 200
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Local source</title></head><body><h1>Source page</h1><a href="/r6/old-guide">Reference</a></body></html>

Before

Requests after the source page: 2 · Redirect responses: 1

GET /r6/old-guide
HTTP 301
Location: /holding
Cache-Control: no-store

GET /holding
HTTP 200
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Temporary notice</title></head><body><h1>Temporary notice</h1><p>The original service is expected to return.</p></body></html>

Terminal response reached

After

Requests after the source page: 2 · Redirect responses: 1

GET /r6/old-guide
HTTP 302
Location: /holding
Cache-Control: no-store

GET /holding
HTTP 200
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Temporary notice</title></head><body><h1>Temporary notice</h1><p>The original service is expected to return.</p></body></html>

Terminal response reached

R07 · Correct permanent mapping remains unchanged

Intended outcome
The old guide already reaches its relevant replacement with a single 301.
Proposed action
Retain the working mapping and record it as a control.
Acceptance check
Before and after evidence is identical. No unnecessary fix or ranking improvement is invented.

Source page link · unchanged

GET /publisher/r7
HTTP 200
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Local source</title></head><body><h1>Source page</h1><a href="/r7/old-guide">Reference</a></body></html>

Before

Requests after the source page: 2 · Redirect responses: 1

GET /r7/old-guide
HTTP 301
Location: /guide
Cache-Control: no-store

GET /guide
HTTP 200
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Replacement guide</title></head><body><h1>Replacement guide</h1><p>Equivalent guide content for the declared mapping.</p></body></html>

Terminal response reached

After

Requests after the source page: 2 · Redirect responses: 1

GET /r7/old-guide
HTTP 301
Location: /guide
Cache-Control: no-store

GET /guide
HTTP 200
Content-Type: text/html; charset=utf-8
Cache-Control: no-store

<!doctype html><html lang="en"><head><title>Replacement guide</title></head><body><h1>Replacement guide</h1><p>Equivalent guide content for the declared mapping.</p></body></html>

Terminal response reached

Run the fixtures

Inspect redirect paths

Seven tested local HTTP examples, not a scan of your website. Source links and redirect responses are shown separately. No search engine or backlink index is queried.

Python 3.10 or newer. Extract the ZIP to a local folder. The verification command starts a temporary loopback server, tests every case, prints JSON and stops. It does not contact external websites.

python3 redirect_lab.py --verify

Stop the server with Ctrl+C, then restart with --phase after to inspect the same URLs in the corrected configuration. Use another local port if 8766 is occupied.

python3 redirect_lab.py --phase before --port 8766

python3 redirect_lab.py --phase after --port 8766

http://127.0.0.1:8766/publisher/r1

http://127.0.0.1:8766/r1/old-guide

http://127.0.0.1:8766/publisher/r2

http://127.0.0.1:8766/r2/old-guide

http://127.0.0.1:8766/publisher/r3

http://127.0.0.1:8766/r3/old-guide

http://127.0.0.1:8766/publisher/r4

http://127.0.0.1:8766/r4/old-guide

http://127.0.0.1:8766/publisher/r5

http://127.0.0.1:8766/r5/old-guide

http://127.0.0.1:8766/publisher/r6

http://127.0.0.1:8766/r6/old-guide

http://127.0.0.1:8766/publisher/r7

http://127.0.0.1:8766/r7/old-guide

Counts cover the displayed GET requests after the source page. The six-request bound belongs to this local teaching client, not to Googlebot. A terminal response can be an error; reaching 200 does not establish relevance.

Commands and paths are technical identifiers; report text is translated.

Indexing, canonical selection, traffic and ranking outcomes remain unmeasured. No percentage of transferred authority is calculated.

Indexing, canonical selection, traffic and ranking outcomes remain unmeasured. No percentage of transferred authority is calculated.