❤️ AZDIGI chính thức cập nhật hệ thống blog mới hoàn chỉnh. Tuy nhiên có thể một số bài viết bị sai lệch hình ảnh, hãy ấn nút Báo cáo bài viết ở cuối bài để AZDIGI cập nhật trong thời gian nhanh nhất. Chân thành cám ơn.
Nếu ứng dụng web của bạn trên DirectAdmin sử dụng RESTful API (Laravel, Node.js, hoặc các SPA framework), bạn có thể gặp lỗi 405 Method Not Allowed hoặc net::ERR_EMPTY_RESPONSE khi gửi request PUT, DELETE, hoặc PATCH.
Bài viết này giải thích nguyên nhân và cách khắc phục lỗi 405 trên DirectAdmin với cả Apache và Nginx.
Nguyên nhân
Mặc định DirectAdmin chỉ cho phép phương thức HTTP POST và GET trong PHP. Các phương thức khác như PUT, DELETE, PATCH, HEAD bị web server chặn lại. Đây là cấu hình bảo mật mặc định, nhưng gây vấn đề cho các ứng dụng API.
Khắc phục trên Apache
Thêm vào file .htaccess của website:
Require all denied
💡 Đặt đoạn LimitExcept ở đầu file .htaccess, trước các rewrite rules của framework (Laravel, WordPress…) để đảm bảo nó được xử lý trước.
Khắc phục trên Nginx (nginx_apache)
Nếu dùng thiết lập nginx_apache, thêm cấu hình vào Nginx custom config:
vi /usr/local/directadmin/data/templates/custom/nginx_server.conf
Thêm nội dung:
proxy_set_header X-HTTP-Method-Override $request_method;
proxy_pass_request_headers on;
Áp dụng cấu hình:
cd /usr/local/directadmin/custombuild
./build rewrite_confs
ℹ️ Nếu dùng OpenLiteSpeed hoặc LiteSpeed, các HTTP methods thường được cho phép mặc định. Lỗi 405 trên LiteSpeed thường do cấu hình ứng dụng, không phải web server.
Kiểm tra sau khi cấu hình
Sau khi thêm cấu hình, bạn có thể dùng curl để kiểm tra nhanh các HTTP methods đã hoạt động chưa:
curl -X PUT -I https://yourdomain.com/api/endpoint
curl -X DELETE -I https://yourdomain.com/api/endpoint
curl -X PATCH -I https://yourdomain.com/api/endpoint
Nếu trả về HTTP status 200 hoặc 204 thay vì 405, cấu hình đã thành công.
Lỗi 405 kết hợp CORS
Nếu frontend và API khác domain (ví dụ app.example.com gọi API tại api.example.com), trình duyệt sẽ gửi preflight request bằng method OPTIONS trước khi gửi PUT/DELETE/PATCH. Nếu server chặn OPTIONS, bạn sẽ thấy lỗi 405 hoặc CORS error.
Để xử lý, thêm vào .htaccess (Apache):
Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, PATCH, OPTIONS"
Header always set Access-Control-Allow-Headers "Content-Type, Authorization"
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
⚠️ Chỉ mở các HTTP methods mà ứng dụng thực sự cần. Không nên allow tất cả methods trên toàn bộ server vì lý do bảo mật.
Tổng kết
Lỗi 405 trên DirectAdmin thường do web server chặn HTTP methods không phải GET/POST. Chỉ cần thêm vài dòng vào .htaccess (Apache) hoặc nginx config là xong. Nếu vẫn gặp lỗi sau khi cấu hình, kiểm tra thêm cấu hình ứng dụng (Laravel .htaccess, PHP handler settings) và đảm bảo CORS headers đã được thiết lập đúng nếu frontend và API khác domain.
Có thể bạn cần xem thêm
- Cloudflare Workers - Chạy code serverless trên edge
- Ollama API - Tích hợp AI self-hosted vào ứng dụng web
- Hướng dẫn xử lý lỗi blocked by CORS policy trên WordPress
- Chặn truy cập xmlrpc.php trên DirectAdmin
- Networking cơ bản trên Linux VPS - IP, DNS, curl và wget
- Cấu hình NGINX FastCGI Cache WordPress trên aaPanel
Về tác giả
Thạch Phạm
Đồng sáng lập và Giám đốc điều hành của AZDIGI. Có hơn 15 năm kinh nghiệm trong phổ biến kiến thức liên quan đến WordPress tại thachpham.com, phát triển website và phát triển hệ thống.