Fix conflicts and loops first
A duplicate source repeats the same destination and status. A conflicting source specifies different destinations or statuses; no rule is chosen for it. A self redirect returns to its own request URL. A cycle comes back to an earlier rule. Paths reaching a conflict or invalid rule stop there.
A chain needs more than one mapped redirect to reach a URL not listed as a source. That endpoint might still redirect or fail on the real site. Consider a direct destination only when it preserves your intended behavior. Multiple sources sharing one destination are not an error.
Choose a status intentionally
- 301: permanent move; a client may change POST to GET.
- 302: temporary location; a client may change POST to GET.
- 303: directs the client to a retrieval request (GET or HEAD), often after a submitted action.
- 307: temporary redirect that preserves the request method.
- 308: permanent redirect that preserves the request method.
A blank status is unknown, not an assumed 301. Google treats permanent and temporary redirects differently as canonicalization signals. This checker cannot predict indexing or rankings.
Supported URLs and comparison rules
Use absolute HTTP/HTTPS URLs or paths starting with one slash. A root-relative source or target always resolves against the base origin you supply, even when another URL in that record names a different host. Bare paths, directory-relative paths, scheme-relative //hosts, credentials, spaces, control characters, raw non-ASCII text, and dot segments are rejected. Use punycode for international hostnames and percent encoding for non-ASCII path/query text. Regex, wildcard and server-rule syntax are not interpreted.
Comparison lowercases the scheme and host, removes an explicit default port (80 for HTTP, 443 for HTTPS), and treats an empty path as /. Path and query case, slash differences, percent-escape spelling, query order, repeated parameters, and an explicit empty ? remain distinct. Nothing is decoded, sorted or broadly declared equivalent. Alternative IPv6 spellings and trailing-dot hosts are not collapsed.
Source fragments are rejected because fragments are not sent to HTTP servers. A target fragment is retained when comparing destinations but omitted when walking request URLs. A same-request redirect that changes only the fragment is flagged as a self redirect. Encoded separators remain encoded. Server normalization and case rules can differ; check them on your own system.
CSV, row references and limits
The first record must contain source,target, with optional status, in any order. Header names ignore surrounding whitespace and case. Every data field remains exact: URL and status whitespace is an error. Use commas as separators; quote a field containing a comma and double any embedded quote. UTF-8 files may include a BOM. A quoted newline stays inside its field and makes that URL invalid, rather than changing record numbering.
“Record 2” is the first data record after the header. These are logical CSV records, not physical line numbers. Blank records are reported rather than silently dropped. Malformed quoting, more than three columns, mixed record separators, oversize input and excess records stop the report. Graph walks exclude invalid or conflicting rules. At most 50 issues are rendered per page; every issue remains in downloads. Long exported path previews are marked as truncated. A complete JSON graph keeps large maps bounded instead of repeating every long path.