v2.9.0 — Redirects Manager + 404 Capture
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:
- See
/old-product-page.htmlwith 247 hits, last referrerhttps://blog.example.com/post-from-2019 - Click Create redirect → form opens with
request_path = old-product-page.html - Fill in
target_path = /new-product-page.html, pick 301, save - The 404 log row gets
resolved = 1automatically - Next time the URL is hit, it 301s — the
byte8_seosuite_404_logdoesn'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:
- Export their data to CSV with at least
request_path+target_pathcolumns - Add a
notescolumn withMigrated from <vendor> on YYYY-MM-DD - Add
source = imported - Dry-run our importer first to catch malformed rows
- 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/$1style. The sidecar table can support them but Magento'surl_rewritecan'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()withsource=auto_healedis the API the auto-healer will use). Building it next. - Hit tracking on redirects —
hit_countcolumn 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