Hai phản hồi đều khiến trình duyệt đổi URL nhưng chưa chắc tạo cùng loại request tiếp theo. Sau khi gửi biểu mẫu, bạn thường muốn hiển thị trang kết quả. Khi chuyển một API sang địa chỉ khác, bạn có thể muốn giữ phương thức và nội dung request. Chọn mã chuyển hướng cần bắt đầu từ sự khác biệt này.
1. Location chỉ cho biết đích đến
Header Location cung cấp địa chỉ chuyển hướng; mã trạng thái diễn đạt cách hiểu việc chuyển đó. Chỉ kiểm tra URL cuối trả về 200 là chưa đủ: cần biết các bước trung gian đã dùng phương thức gì và có gửi lại body hay không.
2. 303: Sau POST, đọc trang kết quả bằng GET
303 See Other phù hợp với tình huống xử lý POST rồi hướng người dùng sang một trang kết quả. Ví dụ giao thức giả định:
POST /requests
HTTP/1.1 303 See Other
Location: /requests/42
GET /requests/42
Đây là mô hình Post/Redirect/Get: gửi biểu mẫu, nhận chuyển hướng, rồi đọc kết quả. Tải lại trang kết quả không đồng nghĩa gửi lại POST ban đầu. Tuy nhiên, mô hình này không tự ngăn nhấp hai lần, retry do mất mạng hay các request trùng trước khi redirect xảy ra. Backend vẫn cần biện pháp chống xử lý lặp phù hợp.
3. 307: Chuyển tạm thời và giữ phương thức
Theo tài liệu 307 Temporary Redirect, khi client thực hiện request chuyển hướng, phương thức và body được giữ lại. Một POST sẽ tiếp tục là POST, không trở thành thao tác đọc trang kết quả.
POST /api/import
HTTP/1.1 307 Temporary Redirect
Location: /api/import-v2
POST /api/import-v2
Trước khi dùng, xác nhận endpoint đích hiểu cùng cấu trúc dữ liệu và có cơ chế xác thực phù hợp. Nếu endpoint ban đầu đã thực hiện tác dụng phụ rồi mới yêu cầu gửi lại, thiết kế có thể gây xử lý hai lần. Không dùng 307 như cách chuyển sang một trang thông báo sau khi tác vụ đã hoàn tất.
4. 308: Đích mới mang ý nghĩa lâu dài
308 Permanent Redirect cũng giữ phương thức và body, nhưng diễn đạt sự chuyển địa chỉ lâu dài. Vì vậy, đây không phải lựa chọn tương đương 307 cho một thử nghiệm ngắn hạn.
Khi triển khai di chuyển endpoint, cần kiểm tra client đang sử dụng, chính sách cache và kế hoạch quay lui. Sửa cấu hình máy chủ không bảo đảm mọi client lập tức quên một chuyển hướng đã ghi nhớ. Không đặt thời gian cache tùy tiện khi chưa có phương án kiểm thử và khôi phục.
5. Kiểm tra toàn bộ chuỗi, không chỉ trang cuối
- Dùng môi trường kiểm thử và dữ liệu giả, đặc biệt với POST có tác dụng phụ.
- Ghi nhận URL, phương thức, status và Location của từng bước.
- Kiểm tra body tại endpoint đích bằng công cụ an toàn; không ghi token hay dữ liệu cá nhân vào log.
- Xác minh cookie, thông tin xác thực và chính sách truy cập với client thực tế; giữ phương thức không bảo đảm mọi header được chuyển nguyên vẹn.
- Thử lỗi xác thực, vòng lặp chuyển hướng và endpoint đích không sẵn sàng.
Không đưa URL tùy ý do người dùng cung cấp vào Location mà chưa kiểm tra đích được phép. Việc giữ body làm chuyện chọn nhầm đích đặc biệt đáng chú ý: dữ liệu chỉ được gửi tới hệ thống có thẩm quyền nhận nó.
6. Chọn theo hành vi cần có
- Đã xử lý biểu mẫu và muốn đọc trang kết quả: cân nhắc 303.
- Cần gửi lại request đến địa chỉ tạm thời với cùng phương thức và body: cân nhắc 307.
- Địa chỉ thay đổi lâu dài và cần giữ phương thức, body: cân nhắc 308.
Đây là tiêu chí thiết kế, không phải chỉ dẫn đổi mã trạng thái hàng loạt. Hãy xác định hành vi mong đợi, kiểm thử client và tác dụng phụ rồi mới triển khai. Một chuyển hướng đúng phải đưa cả người dùng lẫn request đến đúng nơi, theo đúng cách.




Chưa có bình luận. Hãy là người đầu tiên chia sẻ ý kiến.