Khi chạy Moodle trên server quản lý bằng aaPanel, đôi khi upload file có khoảng trắng trong tên bị lỗi hoặc không tải được. Nguyên nhân thường do Apache/Nginx không giải mã URL đúng khi Moodle xử lý PATH_INFO. Bài viết hướng dẫn sửa nhanh trong file core Moodle.

1. Mô tả lỗi
- Upload file không có khoảng trắng trong tên → hoạt động bình thường
- Upload file có khoảng trắng trong tên → báo lỗi hoặc không tải được
| Tên file | Kết quả |
| file1.pdf | ✅ tải lên bình thường |
| lesson1.docx | ✅ tải lên bình thường |
| bai tap.pdf | ❌ lỗi |
| lecture slide.pdf | ❌ lỗi |
Nguyên nhân thường do Apache / Nginx không giải mã URL đúng khi Moodle xử lý PATH_INFO.
2. Nguyên nhân
Trong Moodle, khi xử lý file download/upload, hệ thống dùng biến:
$_SERVER['PATH_INFO']
Với một số cấu hình server (đặc biệt aaPanel + Nginx / Apache), biến này có thể chứa URL encoded string.
Ví dụ: /pluginfile.php/.../bai%20tap.pdf thay vì /pluginfile.php/.../bai tap.pdf. Nếu Moodle không giải mã URL, nó sẽ không tìm thấy file thực tế.
3. Cách sửa lỗi
Chúng ta cần sửa core Moodle để decode URL. ⚠️ Chỉ nên sửa khi server gặp lỗi này.
4. Mở file cần chỉnh
Trên server aaPanel, mở file:
/path/to/moodle/lib/weblib.php
Ví dụ: /www/wwwroot/moodle/lib/weblib.php
5. Tìm đoạn code
Tìm dòng:
$relativepath = $_SERVER['PATH_INFO'];
6. Sửa thành
$relativepath = urldecode($_SERVER['PATH_INFO']);
7. Ví dụ trước và sau khi sửa
Trước khi sửa
$relativepath = $_SERVER['PATH_INFO'];
Sau khi sửa
$relativepath = urldecode($_SERVER['PATH_INFO']);
8. Vì sao cách này hoạt động
Hàm PHP urldecode() sẽ chuyển bai%20tap.pdf thành bai tap.pdf. Nhờ vậy Moodle có thể xác định đúng đường dẫn file trên hệ thống.
9. Áp dụng cho Apache giống IIS
Moodle đã hỗ trợ decode URL cho IIS, nhưng một số cấu hình Apache/Nginx không tự decode. Việc thêm urldecode() giúp Apache xử lý giống IIS.
10. Khởi động lại web server
Sau khi chỉnh sửa, restart web server trong aaPanel: Apache Restart hoặc Nginx Restart.
11. Kiểm tra lại
Upload thử các file: bai tap.pdf, lecture slide.pptx, video lesson 1.mp4. Nếu tải lên bình thường → lỗi đã được khắc phục.
12. Lưu ý quan trọng
Vì sửa core Moodle, khi update Moodle có thể bị ghi đè. Sau khi update cần kiểm tra lại file lib/weblib.php.
13. Giải pháp lâu dài (khuyến nghị)
Ngoài sửa core, có thể cấu hình lại Nginx/Apache rewrite rules hoặc đảm bảo server decode URL đúng chuẩn. Tuy nhiên cách sửa trong weblib.php là nhanh và hiệu quả nhất.
Kết luận
Lỗi upload file có khoảng trắng khi dùng Moodle trên aaPanel xảy ra do PATH_INFO chưa được urldecode. Chỉ cần sửa:
$relativepath = urldecode($_SERVER['PATH_INFO']);
là có thể khắc phục hoàn toàn.