Skip to main content

v2.9.0 — Redirects Manager + 404 Capture

· 4 min read
Magento + commerce specialists

URL hygiene end-to-end. v2.9 closes the loop from "broken link hits a 404" → "editor reviews the 404" → "editor creates a 301 with one click" → "the 301 fires next time the same URL is hit."

Why now

We had hreflang, canonicals, structured data, AI meta, OOS rules, layered-nav controls — but no proper redirects management. Magento's stock url_rewrite admin is hostile: no metadata, no CSV import, no audit, no 404 capture, no idea which redirects are even being used. Every Magento agency we've talked to either built a custom module or paid for one of the four-or-five competing redirects extensions.

So we built one that does what those don't:

Redirects Manager

Marketing → SEO Suite → Redirects — full CRUD over 301/302 redirects with a sidecar metadata table that holds what url_rewrite doesn't:

  • source — manual / imported / auto_healed / oos_engine. Every redirect has provenance.
  • created_by — admin username at create time
  • batch_id — for grouping CSV imports
  • hit_count + last_hit_at — find redirects that haven't been hit in 6+ months and probably can be cleaned up
  • notes — free-form

The actual 301 lives in Magento's url_rewrite table as before, so nothing about how redirects get served changes. Our sidecar is FK'd with ON DELETE CASCADE so deleting a redirect cleanly removes both rows.

CSV import + export

request_path,target_path,redirect_type,store_id,notes
old-page.html,/new-page.html,301,1,Migrated 2026-04-25
shop/old-cat,/shop/new-cat,301,1,
legacy-blog/post,/blog/post,302,0,Temporary

Required: request_path, target_path. Optional: redirect_type (default 301), store_id (default 0), source, notes. Header row required, column order doesn't matter.

Dry-run mode validates without writing — same parser, same validation, no DB changes. The success message tells you how many would be created vs would fail and shows the first 20 errors. Great for migrating off a previous redirects module: dry-run the export, fix what fails, re-run for real.

Export is round-trip safe — what you export, you can re-import.

404 Capture Log

Marketing → SEO Suite → 404 Capture Log — observer on controller_front_send_response_before records every 404 your storefront serves, aggregated by (request_path, store_id) so a path hit 1000 times produces one row with hit_count = 1000, not 1000 rows.

Smart default ignore-list covers the noise:

/static/*, /media/*, /pub/static/*, /pub/media/*,
/api/*, /rest/*, /graphql*,
*.map, *.ico, *.txt, *.xml,
/favicon*, /apple-touch-icon*

Sorted by hit count descending so the worst offenders surface first. Each row carries the most recent referrer + user-agent + query string for context.

Per-row "Create redirect"

The killer UX. From the 404 log:

  1. See /old-product-page.html with 247 hits, last referrer https://blog.example.com/post-from-2019
  2. Click Create redirect → form opens with request_path = old-product-page.html
  3. Fill in target_path = /new-product-page.html, pick 301, save
  4. The 404 log row gets resolved = 1 automatically
  5. Next time the URL is hit, it 301s — the byte8_seosuite_404_log doesn't grow

The redirect's source is set to auto_healed and notes are auto-populated with a reference to the originating 404 entry. Full audit trail.

Daily cron purge

byte8_seosuite_purge_404_log runs at 30 3 * * *. Honours per-store retention (default 90 days) — multi-store installs use the LARGEST configured retention so no store loses data another store wanted to keep.

Migration from competitors

We can't auto-migrate from Mageworx/Amasty redirects modules, but the CSV format is designed to be the lingua franca:

  1. Export their data to CSV with at least request_path + target_path columns
  2. Add a notes column with Migrated from <vendor> on YYYY-MM-DD
  3. Add source = imported
  4. Dry-run our importer first to catch malformed rows
  5. Run for real with a meaningful batch_id

In our grid you can then filter by that batch_id to see all migrated redirects at a glance.

What's NOT in this release

  • Regex redirects^/products/([0-9]+)$ → /shop/products/$1 style. The sidecar table can support them but Magento's url_rewrite can't, so they need a custom router. Roadmapped for v2.10.
  • 404 auto-healer — log-watching + fuzzy URL matching to suggest 301s automatically. The infrastructure for this is now in place (RedirectManager.create() with source=auto_healed is the API the auto-healer will use). Building it next.
  • Hit tracking on redirectshit_count column exists but isn't yet auto-incremented. v2.10.

Migration

Pure additive. Two new tables (byte8_seosuite_redirect, byte8_seosuite_404_log), one new cron, one new admin section, one new menu entry. All gated by config flags off by default.

composer update byte8io/magento-seosuite
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento cache:flush

Then enable in Stores → Configuration → SEO Suite → Redirects & 404 capture.

What's next

  • v2.10: Regex redirects, 404 auto-healer (fuzzy URL matching), hit-count auto-increment
  • v2.11+: HTML sitemap, image/video XML sitemaps, pagination SEO controls, Schema Composer, GSC integration

— The Byte8 team