Tổng quan về lỗi 406 Not Acceptable
Mã trạng thái phản hồi HTTP 406 Not Acceptable xuất hiện khi máy chủ không thể tạo ra phản hồi phù hợp với các tiêu chí được chỉ định trong header Accept của yêu cầu từ phía client. Thông thường, trình duyệt hoặc user agent sẽ gửi các header như Accept-Charset, Accept-Language hoặc Accept (định dạng MIME) để yêu cầu một kiểu dữ liệu cụ thể. Nếu máy chủ không thể đáp ứng định dạng đó, nó sẽ trả về mã 406.
Việc xác định nguyên nhân gốc rễ của các mã lỗi HTTP, đặc biệt là nhóm 4xx, thường khá phức tạp do sự tương tác đa chiều giữa trình duyệt, ứng dụng web, máy chủ và các dịch vụ bên thứ ba.
Lỗi thuộc về Client hay Server?
Theo chuẩn HTTP, tất cả các mã trạng thái bắt đầu bằng số 4 (4xx) được phân loại là lỗi phía client. Điều này khác biệt với nhóm 5xx (lỗi phía server). Tuy nhiên, "lỗi phía client" không hoàn toàn có nghĩa là trình duyệt hoặc thiết bị của người dùng bị hỏng. Trong nhiều trường hợp, chính cấu hình sai lệch trên máy chủ hoặc logic của ứng dụng web đã từ chối yêu cầu hợp lệ từ client và trả về mã 406. Do đó, quá trình xử lý sự cố cần phải kiểm tra cả hai phía.
Nguyên tắc sao lưu trước khi can thiệp
Trước khi thực hiện bất kỳ thay đổi nào đối với hệ thống, việc tạo bản sao lưu toàn diện cho ứng dụng, cơ sở dữ liệu và các tệp cấu hình là bắt buộc. Nếu có điều kiện, hãy triển khai bản sao lưu này lên một môi trường staging (kiểm thử) biệt lập. Điều này giúp bạn tự do thử nghiệm các bản vá lỗi mà không làm gián đoạn hoặc gây rủi ro cho môi trường production đang hoạt động.
Các kịch bản kích hoạt lỗi 406
Lỗi 406 thường liên quan trực tiếp đến việc máy chủ không thể thỏa mãn các header yêu cầu nội dung cụ thể. Một số ví dụ điển hình bao gồm:
- Yêu cầu ngôn ngữ không được hỗ trợ: Client gửi header
Accept-Language: vi(Tiếng Việt) nhưng máy chủ chỉ được cấu hình để phản hồi bằng tiếng Anh (en). Khi không có bản dịch hoặc fallback, server có thể trả về 406. - Định dạng MIME không khả dụng: Client yêu cầu dữ liệu dạng XML thông qua header
Accept: application/xml, nhưng endpoint đó chỉ được thiết kế để trả về JSON (application/json). Nếu server được lập trình nghiêm ngặt, nó sẽ từ chối yêu cầu thay vì tự động chuyển đổi định dạng.
Xử lý sự cố phía Client và CMS
Vì 406 được xếp vào nhóm lỗi client, bước đầu tiên là loại trừ các yếu tố từ phía người dùng hoặc nền tảng quản lý nội dung (CMS).
Kiểm tra tính hợp lệ của URL
Một nguyên nhân phổ biến là URL bị sai lệch hoặc chứa các tham số không mong đợi khiến server hiểu nhầm về định dạng phản hồi. Ví dụ, việc thêm hậu tố .xml hoặc tham số ?format=csv vào một endpoint chỉ hỗ trợ HTML có thể kích hoạt mã 406. Hãy rà soát kỹ lưỡng URL đang được gọi để đảm bảo nó trỏ đến đúng tài nguyên với định dạng mong đợi.
Khắc phục trên các nền tảng CMS (WordPress, Drupal, Joomla)
Nếu bạn đang sử dụng CMS, các plugin hoặc module bên thứ ba thường là thủ phạm gây ra lỗi định tuyến hoặc ép buộc các header không tương thích.
- Hoàn tác các bản cập nhật gần đây: Nếu lỗi xuất hiện ngay sau khi nâng cấp core CMS hoặc một plugin nào đó, hãy hạ cấp (downgrade) về phiên bản trước đó để kiểm tra.
- Vô hiệu hóa plugin/module mới: Tắt dần các tiện ích mở rộng vừa được cài đặt. Nhiều plugin can thiệp sâu vào luồng request/response và có thể tự động thêm các header
Accepthoặc chặn các định dạng không mong muốn. - Kiểm tra biến đổi cơ sở dữ liệu: Một số plugin khi gỡ bỏ không xóa sạch các bảng hoặc cấu hình trong database. Hãy truy cập trực tiếp vào cơ sở dữ liệu để tìm và loại bỏ các bản ghi cấu hình sót lại có thể ảnh hưởng đến việc định tuyến request.
Xử lý sự cố phía Server
Nếu ứng dụng không sử dụng CMS hoặc bạn chắc chắn lỗi không đến từ các thành phần phía client, hãy tập trung vào cấu hình máy chủ web và mã nguồn ứng dụng.
Rà soát cấu hình Web Server
Hai máy chủ web phổ biến nhất hiện nay là Apache và Nginx. Các quy tắc chuyển hướng (rewrite rules) hoặc chặn request thường là nguyên nhân trực tiếp gây ra mã 406.
Đối với Apache (.htaccess)
Hãy tìm tệp .htaccess trong thư mục gốc của ứng dụng và kiểm tra các chỉ thị của module mod_rewrite. Dưới đây là một ví dụ về quy tắc trả về lỗi 406 nếu client không yêu cầu định dạng text/html khi truy cập vào trang chủ:
RewriteEngine On
# Kiểm tra nếu URI là trang chủ
RewriteCond %{REQUEST_URI} ^/trang-chu/?$
# Kiểm tra nếu header Accept KHÔNG chứa text/html
RewriteCond %{HTTP_ACCEPT} !text/html
# Trả về mã 406 và giữ nguyên URI
RewriteRule ^ - [R=406,L]
Nếu bạn phát hiện các quy tắc RewriteCond hoặc RewriteRule tương tự nhưng cấu hình sai, hãy tạm thời comment chúng lại (thêm dấu # ở đầu dòng) và khởi động lại Apache để kiểm tra.
Đối với Nginx (nginx.conf)
Tệp cấu hình Nginx thường nằm ở /etc/nginx/nginx.conf hoặc /etc/nginx/conf.d/. Hãy tìm các khối server hoặc location có sử dụng lệnh return 406. Ví dụ dưới đây chặn các request không mang header Accept: image/webp vào thư mục ảnh:
server {
listen 80;
server_name example.com;
location /assets/images/ {
if ($http_accept !~* "image/webp") {
return 406;
}
# Các chỉ thị phục vụ ảnh khác
}
}
Hãy rà soát toàn bộ tệp cấu hình để tìm các khối if hoặc return bất thường, tạm thời vô hiệu hóa chúng và reload lại Nginx.
Phân tích Log và Debug mã nguồn
Hầu hết các hệ thống đều ghi lại log chi tiết. Hãy kiểm tra access log và error log của web server, cũng như application log (ví dụ: log của Node.js, Python, PHP, hoặc Java). Tìm kiếm các bản ghi tương ứng với thời điểm xảy ra lỗi 406 để xem request mang những header gì và ứng dụng đã xử lý chúng ra sao.
Nếu log không cung cấp đủ thông tin, hãy thiết lập môi trường development cục bộ, tái hiện lại request bằng các công cụ như Postman hoặc cURL với các header Accept khác nhau, và sử dụng debugger để theo dõi luồng thực thi của mã nguồn. Việc này giúp bạn xác định chính xác hàm hoặc middleware nào đang chủ động ném ra ngoại lệ 406.