Skip to content

Pindah Route /wisata: 308, Menu Tak Tertimpa

Adityo Guni Waluyo

Rename route publik itu tiga langkah sekaligus: pindah folder route, redirect 308, dan migrasi baris menu yang hormati editan admin.

Ringkasan

Kukira mindahin route wisata ke pariwisata tinggal git mv doang, ternyata harus tiga hal bareng biar nggak berantakan. Di Nextjs dipasang redirect 308 wildcard jadi bookmark lama tetap nyambung tanpa ngubah method POST. Di database migrasi cuma geser data menu yang masih bawaan, yang udah diedit admin nggak ditimpa.

Sekali lihat, pindah route kelihatannya urusan dua menit: git mv folder wisata jadi pariwisata, satu UPDATE di database, deploy. Waktu nyusun ulang portal jadi empat pilar DISPORAPAR, rencana di kepala saya persis begitu. Realitanya, menu di portal masih nyebut nama lama, bookmark orang bisa jadi mati, dan judul hero di halaman depan masih menyapa dengan identitas yang udah nggak dipakai.

Ternyata rename route publik itu tiga langkah yang harus mendarat bareng: pindahkan pohon route-nya, ajarin server alamat lama biar pengunjung lama tetap nyambung, dan pindahkan baris data yang nunjuk ke path lama. Yang bikin ribet, data itu hidup: menu bisa udah diedit admin lewat CMS, jadi migrasi nggak boleh sekadar menimpa.

308: alamat lama tetap dibaca

Perekat ke dunia luar adalah redirects di next.config.js: /wisata menuju /pariwisata, plus semua subpath-nya lewat bentuk wildcard, dua-duanya dipasang permanen alias 308 [12]. Saya sengaja pilih 308, bukan 301: 308 bilang resource pindah permanen dan client nggak boleh mengubah method plus body request-nya [13]. Bookmark POST yang nyangkut di path lama jadi tetap POST di alamat baru. Redirect ini dicek sebelum filesystem dan query string tetap diteruskan ke tujuan [12]. Alamat admin jalurnya beda dan nggak termasuk aturan ini, jadi nggak ikut ke-redirect.

Data menu: geser, jangan timpa

Perekat kedua ada di MySQL, migrasi 000061. Kebalikannya dari redirect: ini urusan dalam. Menu header dan bottom_nav itu seed-an migrasi, tapi isinya bisa udah diubah admin lewat CMS. Jadi renamename Wisata jadi Pariwisata dibungkus guard ketat: cuma baris yang masih persis nilai seed (location, label, href semuanya cocok) yang di-rename [14].

-- rename only rows still at their seed values
UPDATE menu
SET label = 'Pariwisata',
    href  = CONCAT('/pariwisata', SUBSTRING(href, 8))
WHERE location = 'header'
  AND label = 'Wisata'
  AND href LIKE '/wisata%';

Turunan alamat, misalnya prefix wisata yang bawa parameter kategori atau slug, di-rewrite ke prefix baru lewat SUBSTRING(href, 8), jadi mereka langsung menunjuk tujuan final dan nggak pernah mampir ke redirect [14]. Tiga item pilar baru di-INSERT setelah Beranda, seluruh item header lain digeser sort_order +3 dengan guard NOT IN, dan Pariwisata dipin di urutan 4. Baris identitas site_name plus hero_title cuma ditukar ke DISPORAPAR kalau nilainya masih legacy MuDe; nilai yang udah diedit CMS tetap selamat.

Doktrinnya ada di komentar migrasi itu sendiri: item menu bisa sudah diubah admin, jadi migrasi menggeser urutan item lain, bukan menimpanya. Down migration-nya nyermin persis: DELETE tiga baris pilar, geser balik -3, rename balik, dan kembalikan prefix turunan lewat SUBSTRING(href, 12). Di sisi frontend, folder app router pindah utuh, plus tiga halaman pilar baru dan perluasan spesifikasi e2e portal. Satu commit, dua toko (config Next.js dan data MySQL), satu titik lem berupa redirect. Ada yang ketuk alamat lama, dia tetap sampai; yang sudah di alamat baru, datanya udah dipindah rapi.

Sources

Artikel terkait