Ghost pages served with no canonical
A deleted record still returned a full 200 with an empty
<head>. One truthiness bug, seven controllers,
eleven redirects.
if (!$meta_tags) { redirect(); } ← never firesYou don't hand my findings to a dev team and wait a quarter. I read the codebase, find the cause, ship the fix, and verify it against production — mostly in PHP.
HTTP/1.1 200 OK <!doctype html> <html lang="es"> <head></head> ← empty <body> nav · footer · styles — all present not rendered: <title> <meta name="description"> <link rel="canonical">
A deleted record still returned a full 200 with an empty
<head>. One truthiness bug, seven controllers,
eleven redirects.
if (!$meta_tags) { redirect(); } ← never firesnoindex was impossible<meta robots> was hard-coded to all
on every page. No code path could say noindex —
not even for tag pages with zero articles.
<meta name="robots" content="all"> ← fixed literal, no branch<title>isset($prms['home']) is true even when
home is false. A location suffix rendered
on 100% of pages, in all three languages.
if (isset($prms['home'])) { … } ← true when home === falsePHP · MySQL · a custom MVC framework (15+ yrs in production) · JavaScript · HTML/CSS · Apache / nginx · Git
Search Console · JSON-LD / structured data · Core Web Vitals & Lighthouse · log-file analysis · Screaming Frog · redirect & canonical audits · XML sitemaps
PHP is home. I'm comfortable reading and shipping in whatever the codebase already is.
15+ years in PHP — application code, databases, and a custom MVC framework I still run in production. The last few years I've spent most of my time where backend engineering and technical SEO meet: the bugs that never throw an error but quietly cost a site its rankings.
The write-ups above are from a production site I maintain. The full Search Console before-and-after is available on request.
Email is the fastest way to reach me. Tell me what's stuck — a Search Console screenshot or a single URL is enough to start.