Khác biệt nằm ở chỗ URL trên thanh địa chỉ có đổi hay không.
redirects: server trả về mã 3xx, trình duyệt đi tới URL mới, thanh địa chỉ đổi. Người dùng và Google đều biết trang đã chuyển.rewrites: server âm thầm phục vụ nội dung của đường dẫn khác, thanh địa chỉ giữ nguyên. Giống một proxy nội bộ.
js
// next.config.js
module.exports = {
async redirects() {
return [{ source: '/blog/:slug', destination: '/posts/:slug', permanent: true }]
},
async rewrites() {
return [{ source: '/api/legacy/:path*', destination: 'https://old.example.com/:path*' }]
},
}Chọn thế nào:
- Đổi cấu trúc URL, gộp trang trùng, bỏ trang cũ → redirects với permanent: true (308) để Google chuyển giá trị xếp hạng sang URL mới.
- Khuyến mãi tạm thời, A/B test, đổi tạm đích → permanent: false (307).
- Che một backend/CMS phía sau cùng domain, hoặc migrate dần từng route sang app mới → rewrites.
Lưu ý rewrites không đổi URL nên không truyền tín hiệu SEO — đừng dùng nó để "gộp" hai URL trùng nội dung; việc đó cần redirect hoặc canonical.