Sebuah URL berlalu-lintas tinggi di situs WordPress yang saya kelola tiba-tiba memicu peringatan di laporan crawl: satu halaman menempuh tiga 301 berturut-turut sebelum sampai tujuan.
/podcasts → /resources/ → /podcast → /podcast/
Empat hop, tiga redirect. Lebih dari 9.000 hit lewat rantai ini. Buruk untuk SEO (link equity bocor di tiap hop), buruk untuk crawl budget, dan lambat buat pengguna. Pemilik situs sudah punya teori sendiri: "Tidak ada plugin redirect kok, ini pasti .htaccess." Alasannya sederhana — dia tidak menemukan menu redirect di tempat yang dia kira seharusnya ada.
Dia salah. Dan kesalahannya adalah pelajaran terpenting dari kejadian ini: rantai redirect hampir selalu punya banyak pemilik.
Kenapa orang langsung menuduh .htaccess
.htaccess adalah tersangka yang paling kelihatan karena ia satu file teks yang bisa dibaca. Tapi di WordPress modern, redirect bisa datang dari banyak tempat sekaligus, dan beberapa di antaranya tidak ada di menu Settings sama sekali:
- Redirection plugin — ada di bawah menu Tools, bukan Settings. Inilah kenapa pemilik tadi tidak menemukannya.
- Rank Math → Redirections — terkubur di dalam menu SEO, modul terpisah yang harus diaktifkan.
- WordPress core canonical redirect — memaksa trailing-slash (
/podcast→/podcast/) secara otomatis. - WP core
_wp_old_slug— saat Anda mengubah slug sebuah post, WordPress menyimpan slug lama sebagai post meta dan otomatis me-redirect dari slug-slug lama itu.
Rantai terbentuk ketika target dari satu mekanisme ternyata di-redirect lagi oleh mekanisme lain. Misalnya: Redirection plugin mengirim /podcasts ke /resources/; tapi /resources/ sebenarnya halaman lama yang slug-nya pernah berubah jadi podcast, jadi _wp_old_slug melempar ke /podcast; lalu core canonical menambahkan trailing slash jadi /podcast/. Tiga pemilik berbeda, satu rantai.
Audit SEMUA sumber dulu, jangan menyentuh apa pun
Sebelum menyetujui teori "ini .htaccess", saya audit setiap sumber yang mungkin memiliki redirect:
- Menu Tools → Redirection (plugin Redirection)
- Menu SEO → Rank Math → Redirections
wp_options— pengaturan permalink dan opsi plugin- Post meta
_wp_old_slug— riwayat slug lama tiap post .htaccess— rule mod_rewrite manualfunctions.phptema —wp_redirect()/template_redirectbuatan sendiri
Aturan #1: petakan tiap hop ke pemiliknya sebelum mengubah satu pun.
Aturan Redirection plugin bisa dibaca lewat REST API-nya tanpa harus buka UI:
# Membaca semua rule Redirection plugin
curl -s "https://situs-anda.com/wp-json/redirection/v1/redirect" \
-H "X-WP-Nonce: <nonce>" --cookie "wordpress_logged_in_..."Rule Rank Math harus diedit lewat UI-nya (tidak ada endpoint baca yang nyaman), jadi buka SEO → Redirections secara manual.
Untuk _wp_old_slug, cek langsung di database:
SELECT post_id, meta_value
FROM wp_postmeta
WHERE meta_key = '_wp_old_slug';Perbaiki di SUMBER tiap hop, bukan menumpuk redirect baru
Godaan terbesar saat melihat /podcasts mendarat di /podcast/ adalah membuat satu rule baru /podcasts → /podcast/. Jangan. Itu hanya menambah pemilik kelima dan membiarkan tiga hop lama tetap hidup untuk URL lain.
Yang benar: untuk tiap hop, identifikasi mekanisme yang memilikinya, lalu perbaiki di sumber hop perantara itu sehingga rantai mengkerut jadi satu 301:
- Ubah target rule Redirection dari
/resources/langsung ke/podcast/(tujuan final, dengan trailing slash benar) — ini menghapus dua hop sekaligus. - Bersihkan
_wp_old_slugyang sudah usang kalau tidak lagi dibutuhkan, agar core tidak ikut melempar. - Pastikan rule Anda sudah menulis bentuk kanonik (
/podcast/) supaya core canonical tidak perlu menambah hop trailing-slash lagi.
Verifikasi: satu hop, bukan tiga
Setelah memperbaiki, buktikan rantainya benar-benar runtuh jadi satu 301. Dari browser:
// .url adalah URL final setelah semua redirect diikuti
fetch("https://situs-anda.com/podcasts", { redirect: "follow" })
.then(r => console.log(r.url));Atau hitung jumlah 301 dari command line:
# -I header only, -L ikuti redirect, -s senyap
curl -sIL "https://situs-anda.com/podcasts" | grep -i "^HTTP\|^location"Yang Anda mau lihat: tepat satu baris 301, lalu 200. Kalau masih muncul dua atau tiga 301, berarti ada hop yang pemiliknya belum Anda perbaiki.
Checklist saat menemukan rantai redirect
- Jangan percaya "tidak ada plugin redirect" — cek menu Tools dan menu SEO, bukan cuma Settings.
- Petakan tiap hop ke pemiliknya: Redirection, Rank Math, core canonical,
_wp_old_slug,.htaccess,functions.php. - Baca rule Redirection lewat REST API (
/wp-json/redirection/v1/redirect); Rank Math lewat UI. - Perbaiki di sumber hop perantara agar rantai runtuh jadi satu 301 — jangan menumpuk rule baru.
- Verifikasi dengan
fetch(...).urlataucurl -sILdan pastikan cuma ada satu 301.
Pelajarannya: rantai redirect itu biasanya multi-owner. Jangan pernah berasumsi cuma ada satu sumber. Petakan setiap hop ke pemiliknya dulu — baru sentuh apa pun.
