Bài này hướng dẫn đưa một dự án Laravel lên hosting dùng bảng điều khiển DirectAdmin.
Có hai cách. Cách 1 an toàn hơn và nên dùng nếu được. Cách 2 là phương án khi hosting không cho đổi thư mục gốc, và nó đòi thêm vài bước bảo vệ bắt buộc.
1. Vì sao Laravel không giống một website PHP thông thường
Một website PHP thông thường thì mọi tệp đều nằm trong thư mục gốc của tên miền, và trình duyệt vào được tất cả.
Laravel thì khác: nó được thiết kế để chỉ thư mục public là công khai. Những thư mục còn lại nằm ngoài tầm với của trình duyệt, trong đó có:
| Thư mục hoặc tệp | Chứa gì |
|---|---|
.env |
Mật khẩu cơ sở dữ liệu, khoá ứng dụng, khoá dịch vụ bên ngoài |
storage |
Nhật ký, tệp người dùng tải lên, bộ nhớ đệm |
vendor |
Toàn bộ thư viện, kèm phiên bản của chúng |
app, config, routes |
Mã nguồn và cấu hình |
Hiểu điều này là hiểu vì sao hai cách dưới đây khác nhau về mức độ an toàn.
2. Cách 1: trỏ thư mục gốc của tên miền vào public
Đây là cách Laravel được thiết kế để chạy, và là cách nên dùng.
- Tải toàn bộ dự án lên hosting, giữ nguyên cấu trúc thư mục, không di chuyển gì cả. Đặt ở một chỗ ngoài thư mục gốc hiện tại, ví dụ
/home/<tài khoản>/laravel-app. - Trong DirectAdmin, mở phần quản lý tên miền và đổi thư mục gốc (document root) của tên miền thành thư mục
publiccủa dự án. - Nếu không thấy mục đổi thư mục gốc, hãy liên hệ bộ phận hỗ trợ, vì tuỳ gói hosting mà quyền này có thể bị giới hạn.
Làm xong thì không phải sửa index.php, không phải di chuyển tệp, và toàn bộ phần nhạy cảm nằm ngoài tầm với của trình duyệt.
Khi nâng cấp dự án về sau, chỉ việc thay mã nguồn, không phải làm lại bước nào.
3. Cách 2: đưa nội dung public ra thư mục gốc
Dùng khi hosting không cho đổi thư mục gốc.
🔴 Cách này đặt toàn bộ dự án vào vùng trình duyệt vào được. Làm theo mà bỏ qua mục 4 thì bất kỳ ai cũng có thể mở https://tên-miền-của-bạn/.env và đọc được mật khẩu cơ sở dữ liệu. Mục 4 là bắt buộc, không phải tuỳ chọn.
Bước 1. Mở thư mục dự án trên máy của quý Khách hàng. Nên sao ra một bản khác rồi sửa trên bản sao, giữ nguyên bản gốc.

Bước 2. Cắt toàn bộ nội dung bên trong thư mục public.

Bước 3. Quay lại thư mục gốc của dự án và dán vào đó.

Bước 4. Sửa tệp index.php vừa chuyển ra. Tìm hai dòng:
require __DIR__.'/../vendor/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';

Đổi thành:
require __DIR__.'/vendor/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';

Hai dòng này đang trỏ lên một cấp vì index.php vốn nằm trong public. Khi nó đã ra thư mục gốc thì không còn cấp nào để lên nữa.
Bước 5. Sửa tệp .env cho khớp thông tin cơ sở dữ liệu trên hosting.

Bước 6. Xoá bộ nhớ đệm cũ sinh ra lúc chạy ở máy cá nhân, trong bootstrap/cache và storage/framework. Đây là chỗ hay làm website báo lỗi ngay sau khi lên hosting, vì các tệp đệm còn giữ đường dẫn của máy cũ.



4. 🔴 Bắt buộc nếu dùng Cách 2: chặn truy cập các tệp nhạy cảm
Tạo tệp .htaccess ở thư mục gốc (hoặc bổ sung vào tệp đã có) với nội dung:
# Chan truy cap tep cau hinh va cac thu muc khong duoc phep cong khai
<FilesMatch "^\.env">
Require all denied
</FilesMatch>
RedirectMatch 404 ^/(vendor|storage|bootstrap|app|config|database|routes|resources|tests)/
RedirectMatch 404 ^/(composer\.(json|lock)|artisan|package\.json)$
Sau khi đặt xong, kiểm bằng cách mở thử các địa chỉ sau trên trình duyệt. Cả ba phải ra trang báo lỗi, không được hiện nội dung:
https://<tên-miền-của-bạn>/.env
https://<tên-miền-của-bạn>/composer.json
https://<tên-miền-của-bạn>/storage/logs/laravel.log
Nếu một trong ba địa chỉ hiện ra nội dung thì tệp .htaccess chưa có tác dụng. Đừng đưa website vào chạy thật cho tới khi cả ba đều bị chặn.
5. Cơ sở dữ liệu
Tạo cơ sở dữ liệu và nhập dữ liệu vào theo bài Hướng dẫn tạo mới và import database bằng phpMyAdmin trên DirectAdmin.
Sau đó khai lại bốn dòng trong .env cho khớp: tên cơ sở dữ liệu, tên người dùng, mật khẩu và máy chủ.
6. Tải dự án lên hosting
Hai cách, chọn một:
Với dự án nhiều tệp nhỏ, nén lại thành một tệp .zip rồi tải lên và giải nén trên hosting sẽ nhanh hơn nhiều so với tải từng tệp qua FTP. Thư mục vendor thường có hàng chục nghìn tệp.
7. Lỗi thường gặp sau khi đưa lên
| Hiện tượng | Nguyên nhân thường gặp |
|---|---|
| Trang trắng, không báo gì | Chưa xoá bộ nhớ đệm cũ ở bước 6, hoặc sai quyền thư mục storage |
| Báo lỗi không kết nối được cơ sở dữ liệu | Bốn dòng cấu hình trong .env chưa khớp với thông tin hosting |
| Báo lỗi khoá ứng dụng | Thiếu APP_KEY trong .env |
Mở được .env từ trình duyệt |
Chưa làm mục 4. Xử lý ngay, và đổi mật khẩu cơ sở dữ liệu vì nó đã công khai |
| Trang chủ chạy, trang con báo lỗi | Thiếu tệp .htaccess của Laravel ở thư mục gốc |
Hàng thứ tư cần xử lý ngay trong ngày. Mật khẩu đã công khai thì phải coi như đã lộ, kể cả khi chưa thấy dấu hiệu bị khai thác.
8. Nếu cần hỗ trợ
Quý Khách hàng gặp vướng ở bước đổi thư mục gốc, hoặc không chắc tệp nhạy cảm đã được chặn, hãy nhắn qua khung chat ở góc phải màn hình kèm tên miền, bộ phận kỹ thuật sẽ kiểm giúp.