Skip to main content

No redirect chains longer than one hop

ab-002472 · seo-advanced.crawlability.redirect-chains
Severity: highactive

Why it matters

Every extra redirect hop costs ~500ms of crawler wait and burns one of Googlebot's retry slots — chains longer than one hop often get abandoned mid-traversal, leaving the final destination unindexed. Temporary 302/307 codes prevent PageRank consolidation entirely, so old URLs keep their equity while the new URL ranks from scratch. The compounding effect tanks migration projects and kills redirected link equity.

Severity rationale

High because chained and temporary redirects silently drop PageRank and abandon crawls mid-traversal.

Remediation

Flatten every chain to a single 301 hop and delete intermediate redirects from next.config.js. Audit with curl -IL to verify status codes:

// next.config.js
module.exports = {
  async redirects() {
    return [{ source: '/old-product', destination: '/products/item', permanent: true }]
  }
}

Detection

  • ID: seo-advanced.crawlability.redirect-chains

  • Severity: high

  • What to look for: Count all redirect rules defined in framework config (next.config.js redirects(), vercel.json, .htaccess, middleware). For each redirect, follow the chain and count the number of hops. Enumerate every redirect that uses temporary status codes (302, 307) instead of permanent (301, 308). Verify no more than 1 hop exists in any chain.

  • Pass criteria: Zero redirect chains with more than 1 hop. At least 90% of redirects use permanent status codes (301 or 308). All redirect destinations return a 200 response. Report: "X redirects found, 0 chains, Y of X use permanent codes."

  • Fail criteria: At least 1 redirect chain with more than 1 hop exists, or more than 10% of redirects use temporary codes (302, 307), or any redirect destination returns an error.

  • Skip (N/A) when: The project has no redirects defined (fresh project without URL migrations).

  • Detail on fail: "Old URL redirects through 2 hops: /old-product -> /product -> /products/item" or "3 of 8 redirects use 302 (temporary) instead of 301 (permanent)".

  • Remediation: Minimize redirects and use permanent codes. In next.config.js:

    // next.config.js
    async redirects() {
      return [
        {
          source: '/old-path',
          destination: '/new-path',
          permanent: true, // 301
        },
      ]
    }
    

Taxons

History