Skip to content
Novandri.

Three Technical SEO Bugs Diagnosed from Symptom to Root Cause

Work through three clearly labeled technical SEO lab scenarios: a 200 page with missing rendered content, a WAF-blocked crawler, and conflicting URL signals.

Rachmadwipa Novandri7 min read

The same search symptom can come from different layers. A page reported as unavailable may return 200 to a browser but omit its main content from rendered output; a crawler-specific 403 may be generated by a firewall rather than the application; and a URL that appears duplicated may have competing redirects, canonical tags, and sitemap entries.

The fastest way to diagnose these problems is to separate observations from hypotheses, test at the layer that can confirm each hypothesis, and verify the fix with a repeatable check.

Direct answer: Follow a symptom through HTTP delivery, rendering, access controls, and URL signals instead of treating an SEO report as the root cause. This article walks through three illustrative lab scenarios, not client cases or observed production incidents: a 200 response whose main content never renders, a WAF rule returning 403 to a verified crawler, and conflicting canonical/redirect/sitemap signals. In each case, compare plausible causes, run the discriminating tests, fix the confirmed source, then add a regression test.

Evidence note: The cases, hostnames, output, and results below are hypothetical reproductions for teaching diagnostic reasoning. They are not measurements from a live site, Googlebot log, or customer system.

Case 1: The URL returns 200, but the main content is missing

Symptom

A page responds with HTTP 200, but its main text does not appear in the expected rendered page. A status check alone looks healthy, while a crawler or user may see a shell, error state, or empty content area.

Hypotheses

  1. The server returns an empty or generic HTML shell and client-side JavaScript fails to fetch data.
  2. The content API request returns an error or is blocked by a content security policy.
  3. The content is present in the document but hidden by CSS or only inserted after a user interaction.
  4. A cache serves stale or mismatched HTML and API responses.

Tests that distinguish them

First inspect the response and its body, not just the status:

curl -sS -D /tmp/page-headers.txt \
  -o /tmp/page.html https://example.test/articles/example
head -n 20 /tmp/page-headers.txt
grep -n "Expected article phrase" /tmp/page.html

Then load the page in a browser with DevTools open. Check the Console for runtime exceptions, the Network panel for failed API requests, and the rendered DOM for the expected text. Compare with JavaScript disabled only as a diagnostic; it is not a complete substitute for checking the actual rendering behavior.

In this hypothetical reproduction, the initial HTML returns 200 with a root element, but the browser console shows a failed request to the content API. That observation supports the API-failure hypothesis; it does not establish that all 200 pages are problematic.

Root cause and fix

For the lab scenario, the deployment points the frontend at a preview API origin that is not available to public visitors. Fix the production API configuration and ensure the application handles fetch errors without presenting a misleading empty success page. Where the page's primary content is essential, consider delivering it in the initial HTML or another resilient rendering path appropriate to the application.

Regression test

Add a build or preview test that checks a stable article-content marker in the HTML or rendered DOM, plus an availability check for required API resources. Avoid asserting every paragraph verbatim, since editorial updates should not break the test.

For the source-versus-rendered distinction, see Raw HTML vs Rendered DOM: What Can a Crawler Read?.

Case 2: A crawler receives 403 while a normal browser receives 200

Symptom

The page loads for a team member, but requests identified as a crawler receive HTTP 403 Forbidden. This can arise at the CDN/WAF edge, reverse proxy, application authorization layer, or from an invalid test setup.

Hypotheses

  1. A WAF rule blocks a request pattern or source range.
  2. The test is using a spoofed crawler User-Agent from an unverified IP, and the site intentionally rejects it.
  3. An application rule requires cookies, authentication, or a particular header.
  4. A CDN cache or bot-management setting behaves differently at one edge location.

Tests that distinguish them

Compare requests while changing one variable at a time. Record timestamp, URL, response headers, edge request ID, and the exact environment. Do not conclude that a request is genuine Googlebot merely because its User-Agent says so. Verify crawler identity using Google's published IP ranges or forward-confirmed reverse DNS as described in its documentation.

Then correlate the request with edge and origin logs. If the edge log records a WAF rule ID and no corresponding origin request exists, that is evidence the request was denied before reaching the application. If the request reaches the origin, inspect application authorization and upstream logs instead.

The following is a hypothetical diagnostic pattern, not real log output:

Browser test:        HTTP 200, edge request ID edge-a1
Verified bot sample: HTTP 403, edge rule bot-challenge-17
Origin log:          no matching request for edge request ID edge-b2
Interpretation:      investigate the edge policy before changing application code

Root cause and fix

In this lab scenario, the WAF applies an overbroad challenge rule to a path used by public article pages. Review the rule with the security owner and make the narrowest safe adjustment. Do not create a blanket allowlist based only on User-Agent text; preserve protections against spoofed bots and abusive traffic.

Regression test

Add a monitored check from an approved test environment and correlate its edge request ID with the expected rule behavior. For genuine search crawlers, continue to verify identity from trusted mechanisms and review server logs. Avoid high-volume probing or bypassing access controls.

For crawler request analysis, see Server Logs for SEO: See What Googlebot Requests and CDN Caching and Googlebot: Avoid Origin Overload.

Case 3: Redirect, canonical, and sitemap disagree

Symptom

Several URL variants return content or appear in crawls, while signals disagree about the preferred URL. For example, an old path redirects to one destination, the destination's canonical points elsewhere, and the sitemap lists a third variant.

Hypotheses

  1. A migration redirect map contains a stale target.
  2. Canonical generation uses a different host or path-normalization rule from routing.
  3. Sitemap generation includes non-canonical or redirected URLs.
  4. The sampled URLs are not equivalent pages, so consolidation is not appropriate.

Tests that distinguish them

Select a small URL set and record each URL's status, redirect chain, final URL, canonical, and sitemap presence. Inspect both response headers and HTML. Repeat for the relevant page template and check internal links for the same destination policy.

In this hypothetical example, /old-guide redirects to /guide, while /guide emits a canonical to /guides/guide and the sitemap lists /old-guide. The test confirms inconsistent site-controlled signals; it does not prove how a search engine will resolve them.

Root cause and fix

For the lab scenario, a prior path migration updated routing but left the canonical generator and sitemap source unchanged. Update all three to the chosen preferred URL, then update internal links to point directly to it. If the pages are not equivalent, do not force consolidation merely to make the signals match—review the content and intended URL architecture first.

Regression test

Add fixtures asserting that each legacy URL reaches the intended final destination, that the destination's canonical is consistent with policy, and that the sitemap contains only intended canonical URLs. Keep expected paths in one shared test fixture where possible to reduce drift.

For canonical signal limits, read Canonical Tags and Duplicate URLs: Signals, Not Commands.

A repeatable debugging template

For each incident, capture:

Symptom and exact URL:
Time, environment, and deployment ID:
Observed evidence (status, headers, logs, render output):
Hypotheses considered:
Test that distinguished the hypotheses:
Confirmed root cause (or remaining uncertainty):
Fix and owner:
Regression test and post-fix evidence:

This record keeps a plausible explanation from being mistaken for a verified cause and makes the result useful to the next engineer.

Summary

Diagnose technical SEO bugs by tracing the exact request and separating layers. A 200 does not prove the main content rendered; a crawler 403 must be localized to edge or origin and tested with verified identity; and conflicting URL signals should be measured across redirects, canonicals, internal links, and sitemap entries. The scenarios here are simulated teaching examples. For production incidents, replace them with authorized, time-stamped evidence and verify each fix.

For the broader diagnostic sequence, see A Technical SEO Audit That Follows the Request Path.