Khác với hầu hết trang lỗi, 403 Forbidden không phải dấu hiệu có gì đó hỏng. Yêu cầu đã tới nơi, máy chủ hiểu hoàn hảo, tìm thấy tài nguyên, rồi từ chối giao nó cho bạn. Sự từ chối đó là có chủ đích.
Điều này quan trọng vì nó thay đổi thứ bạn cần tìm. Không có sự cố nào để phát hiện, không có dịch vụ nào để khởi động lại — chỉ có một quy tắc ở đâu đó nói "không phải cái này, không phải cho bạn". Bài này giải thích khác biệt giữa 403 và 401, các nguyên nhân theo thứ tự thực tế, và những tình huống 403 nghĩa là mọi thứ đang hoạt động đúng như thiết kế.
403 Forbidden khác 401 Unauthorized ở đâu
Hai mã này bị hoán đổi thường xuyên, kể cả bởi lập trình viên, và phân biệt được chúng thực sự hữu ích khi bạn đang sửa lỗi.
401 nghĩa là "tôi không biết bạn là ai — hãy chứng minh". Đăng nhập có thể giải quyết. 403 nghĩa là "tôi biết chính xác bạn là ai, và câu trả lời vẫn là không". Đăng nhập sẽ không giúp gì, vì danh tính chưa bao giờ là vấn đề.
| Mã | Ý nghĩa | Khách có thể làm gì |
|---|---|---|
| 401 Unauthorized | Bạn chưa xác thực, hoặc thông tin đăng nhập bị từ chối | Đăng nhập, hoặc sửa thông tin đang gửi |
| 403 Forbidden | Đã xác định được bạn nhưng bạn không có quyền | Không làm gì được — chủ sở hữu phải đổi quy tắc |
| 404 Not Found | Tài nguyên không tồn tại ở địa chỉ đó | Kiểm tra lại URL xem có gõ sai không |
| 429 Too Many Requests | Bạn bị giới hạn vì gửi quá nhiều yêu cầu | Chờ, rồi giảm tốc độ |
Nguyên nhân thường gặp, phổ biến nhất trước
- Sai quyền file hoặc thư mục. File web thường cần 644 và thư mục cần 755. File đặt 600 thì web server không đọc được và sinh 403 ngay lập tức.
- Không có file index trong thư mục, trong khi liệt kê thư mục đã tắt. Máy chủ không có gì để hiển thị và không được phép liệt kê file, nên từ chối. Đây là nguyên nhân số một của tình huống "thư mục của tôi báo 403".
- Một quy tắc trong .htaccess hoặc cấu hình máy chủ. Một dòng "Deny from all", một quy tắc chống hotlink, hoặc danh sách IP cho phép mà bạn không còn nằm trong đó.
- Plugin bảo mật hoặc WAF chặn bạn. Plugin tường lửa của WordPress, ModSecurity và các quy tắc Cloudflare đều trả về 403 khi một yêu cầu vi phạm quy tắc — thường là báo động giả với một yêu cầu hoàn toàn bình thường.
- IP của bạn đã bị chặn. Hoặc cố ý, hoặc tự động bởi trình chặn brute-force sau các lần đăng nhập thất bại.
- File thuộc sai người dùng. Hay gặp sau khi tải lên qua SSH bằng quyền root hoặc phục hồi từ bản sao lưu — file vẫn ở đó và trông ổn nhưng web server không đọc được.
- Chặn theo vùng địa lý hoặc chặn bot. Một số trang trả 403 cho cả quốc gia, cho dải IP của trung tâm dữ liệu, hoặc cho bất cứ thứ gì trông tự động. Người dùng VPN gặp chuyện này liên tục.
Kiểm tra theo thứ tự này
Bắt đầu bằng việc xác định lỗi chỉ xảy ra với bạn hay với tất cả mọi người, vì riêng dữ kiện đó đã loại được nửa danh sách trên.
- Mở trang trong cửa sổ ẩn danh, rồi mở bằng dữ liệu di động với Wi-Fi tắt. Nếu dữ liệu di động vào được, IP của bạn đang bị chặn và quyền file không phải vấn đề.
- Nhờ người ở nước khác mở giúp, hoặc dùng công cụ kiểm tra trực tuyến. Bạn nhận 403 còn họ nhận 200 nghĩa là đang bị chặn theo vùng hoặc theo IP.
- Nếu lỗi với tất cả mọi người, kiểm tra quyền trước: 644 cho file, 755 cho thư mục. Trên shared hosting, File Manager hiển thị và đổi được; qua SSH dùng "chmod 644" và "chmod 755".
- Xác nhận thư mục có file index — index.html hoặc index.php. Nếu bạn thực sự muốn khách xem danh sách file, phải bật liệt kê thư mục một cách rõ ràng.
- Đổi tên .htaccess thành .htaccess.bak rồi tải lại. Nếu 403 biến mất, một quy tắc trong file đó là thủ phạm và bạn có thể lần ra từ đấy. Nhớ khôi phục file sau khi đã biết.
- Tắt từng plugin bảo mật một. Plugin tường lửa và "gia cố" là nguồn báo động giả 403 rất thường gặp, đặc biệt với URL quản trị và endpoint REST API.
- Đọc error log của máy chủ. Apache và ModSecurity đều ghi lại quy tắc nào đã kích hoạt, biến việc đoán mò thành một dòng văn bản rõ ràng.
- Kiểm tra chủ sở hữu file. Trên máy chủ Linux thông thường web server chạy dưới www-data, nginx hoặc một user riêng của tài khoản; file thuộc root sẽ không đọc được dù quyền trông có vẻ đúng.
Khi 403 là hoàn toàn đúng
Không phải 403 nào cũng là lỗi. Rất nhiều trong số đó là máy chủ đang bảo vệ thứ gì đó đúng như thiết kế, và "sửa" chúng mới là sai lầm thật sự.
File cấu hình, thư mục sao lưu, thư mục .git, file môi trường và thư mục upload không được phép chạy code đều bị chặn một cách thường quy và chính xác. Nếu bạn thấy 403 trên /.env hay /.git/config, đó là tin tốt — nếu những file ấy đọc được mới là sự cố bảo mật thực sự.
Giới hạn tốc độ và chặn bot cũng hiện ra dưới dạng 403. Nếu công cụ thu thập dữ liệu, hệ thống giám sát hay API client của bạn nhận 403 trong khi trình duyệt vẫn vào bình thường, máy chủ đang nói rằng nó không muốn lưu lượng tự động ở tốc độ đó. Cách xử lý là giảm tốc hoặc xin quyền truy cập, không phải ngụy trang yêu cầu.
Trước khi đổi bất cứ thứ gì, hãy tự hỏi tài nguyên này có nên công khai không. Nếu câu trả lời là không, 403 đang làm đúng việc của nó và điều nên làm là để yên.
Muốn toàn quyền với phân quyền và quy tắc tường lửa của mình?
Cloud VPS với quyền root đầy đủ, error log thật và không bị giới hạn như shared hosting — từ ฿150/tháng.
Câu hỏi thường gặp
Vì sao tôi bị 403 còn đồng nghiệp thì không?
Có thứ gì đó đang đối xử với yêu cầu của bạn khác đi — hầu như luôn là địa chỉ IP. Hoặc nó bị chặn cố ý, hoặc trình chặn brute-force đã chặn sau các lần đăng nhập thất bại, hoặc bạn đang dùng VPN có IP nằm trong danh sách đen. Thử bằng dữ liệu di động: nếu trang mở được, IP chính là điểm khác biệt.
Tôi đặt file thành 777 mà vẫn 403. Tại sao?
Vì quyền có lẽ chưa bao giờ là vấn đề, và giờ bạn còn tạo thêm rủi ro bảo mật. Nếu 777 không sửa được, hãy xem quyền của thư mục cha, chủ sở hữu file, hoặc một quy tắc deny rõ ràng trong .htaccess. Dù sao cũng hãy đặt file về 644.
403 có ảnh hưởng thứ hạng tìm kiếm không?
Có, nếu Googlebot là bên nhận nó. Các quy tắc tường lửa quá gắt đôi khi chặn cả bot của công cụ tìm kiếm, và trang mà Google không lấy được cuối cùng sẽ rơi khỏi chỉ mục. Dùng URL Inspection trong Search Console để xem chính xác Googlebot nhận được gì — có thể rất khác với những gì bạn thấy.
Làm sao biết 403 đến từ Cloudflare hay từ máy chủ của tôi?
Trang 403 của Cloudflare có nhận diện thương hiệu và kèm ray ID; 403 của máy chủ thường là trang đơn giản từ Apache hoặc Nginx, hoặc trang lỗi tùy chỉnh của bạn. Nếu là Cloudflare, quy tắc nằm trong bảng điều khiển Cloudflare chứ không phải trên máy chủ — đó là lý do sửa .htaccess không đem lại kết quả gì.
GUIDES
Bài viết liên quan
Đọc tiếp các chủ đề tương tự
404 Not Found — Nguyên nhân, ảnh hưởng SEO và khi nào là đúng
Website nào cũng có 404 và phần lớn không sao cả. Chỉ một nhóm nhỏ mới đáng quan tâm: những trang từng tồn tại và vẫn còn người trỏ link tới, cùng biến thể âm thầm trả về mã 200 trong khi hiển thị "không tìm thấy".
Đọc tiếp500 Internal Server Error — Nguyên nhân và cách sửa
500 là lỗi ít thông tin nhất trên web: nó nghĩa là "có gì đó hỏng và tôi sẽ không nói là gì". Tin tốt là máy chủ gần như luôn ghi lý do thật vào một file log. Bài này chỉ chỗ file đó và thứ tự kiểm tra nhanh nhất để tìm ra thủ phạm.
Đọc tiếp502 Bad Gateway — Ý nghĩa và cách khắc phục
502 nghĩa là một máy chủ đã hỏi máy chủ khác để lấy trang và nhận về thứ không dùng được. Bài này giải thích hai máy nào đang liên quan, khác biệt với 500 và 504, cùng thứ tự kiểm tra để bạn tìm đúng nguyên nhân trước tiên.
Đọc tiếp