Nhật ký công việc cho nhiệm vụ "Chuẩn bị các template và tuyến đường cho haih-cms"
Assets Proxy Middleware cho legacy assets
Trong bản cài đặt mới, một middleware đã được thêm vào để phục vụ các tệp tĩnh của trang web legacy tại đường dẫn /assets/.
Vấn đề ban đầu
Trong lịch sử, Rails Asset Pipeline phân giải các liên kết asset không trực tiếp theo vị trí tệp vật lý, mà thông qua cơ chế tìm kiếm và manifest riêng của nó. Do đó, các tệp thực tế có thể nằm trong các thư mục con khác nhau, trong khi HTML và CSS vẫn tiếp tục tham chiếu đến chúng thông qua các đường dẫn đơn giản hóa.
Trong thực tế, ít nhất các tùy chọn lưu trữ sau đã được phát hiện:
shared/assets/— các asset chính;shared/assets/stylesheets/— CSS và các tệp liên quan;shared/assets/stylesheets/fonts/— phông chữ (fonts).
Đồng thời, các liên kết từ phía client có thể trông giống như /assets/filename.css hoặc dạng tương đối url(font.woff2) mà không chỉ định thư mục con thực tế. Trong ứng dụng Rails cũ, điều này được ẩn đi bởi logic của Asset Pipeline.
Giải pháp đã thực hiện
Middleware server/middleware/assetsProxy.ts đã được thêm vào, có nhiệm vụ chặn các yêu cầu đến /assets/ và tìm kiếm tuần tự tệp được yêu cầu trong một số thư mục legacy đã biết.
Thứ tự tìm kiếm:
shared/assets/shared/assets/stylesheets/shared/assets/stylesheets/fonts/
Tệp phù hợp đầu tiên tìm thấy sẽ được trả về cho client. Do đó, hệ thống mới tái tạo lại phần cần thiết của hành vi Rails Asset Pipeline mà không cần chuyển đổi chính pipeline đó.
Bảo mật
Middleware cung cấp các giới hạn cơ bản để chống thoát khỏi thư mục asset (directory traversal):
- chặn các đường dẫn chứa
..; - chặn dấu hai chấm trong đường dẫn;
- sau khi chuẩn hóa, kiểm tra xem đường dẫn đã phân giải có nằm bên trong
shared/assets/hay không.
Ý nghĩa đối với việc di chuyển (Migration)
Giải pháp này cho phép hiển thị chính xác các trang và kiểu dáng legacy trong thời gian chuyển đổi mà không cần viết lại thủ công một lượng lớn các liên kết asset lịch sử. Đồng thời, logic tương thích được cô lập ở một nơi và không xâm nhập vào mô hình dữ liệu cốt lõi hoặc định tuyến của haih-cms.
Kiểm tra tiếp theo
- kiểm tra các MIME type chính xác cho CSS, JS, font và hình ảnh;
- kiểm tra các header bộ nhớ đệm (cache headers);
- kiểm tra hành vi khi trùng tên tệp trong nhiều thư mục;
- đảm bảo middleware không cho phép đọc các tệp nằm ngoài cây thư mục được phép;
- khi các asset được chuẩn hóa, quyết định xem có cần proxy như một lớp vĩnh viễn hay chỉ để tương thích khi di chuyển.
Triển khai các template trang chính, điều hướng và định tuyến trong haih-cms cần thiết để thay thế trang web Ruby.