Website được thiết kế tối ưu cho thành viên chính thức. Hãy Đăng nhập hoặc Đăng ký để truy cập đầy đủ nội dung và chức năng. Nội dung bạn cần không thấy trên website, có thể do bạn chưa đăng nhập. Nếu là thành viên của website, bạn cũng có thể yêu cầu trong nhóm Zalo "CNTT" các nội dung bạn quan tâm.

22. Cấu hình HTTPS chuẩn, loại bỏ HTTP

ICT

1. Vì sao “có HTTPS” là chưa đủ?

Rất nhiều hệ thống rơi vào trạng thái:

  • Có HTTPS nhưng HTTP vẫn truy cập được

  • HTTP redirect không nhất quán

  • Website bị lỗi mixed content

  • Trình duyệt vẫn hiển thị cảnh báo bảo mật

Nguyên nhân là:

HTTPS chưa được cấu hình như một chuẩn bắt buộc, mà chỉ như một tuỳ chọn.

Trong môi trường production hiện nay:

HTTPS phải là mặc định duy nhất, HTTP chỉ tồn tại để redirect.


2. Mục tiêu cấu hình HTTPS chuẩn

Sau bài này, hệ thống cần đạt được:

  1. Toàn bộ truy cập đều đi qua HTTPS

  2. HTTP chỉ dùng để redirect sang HTTPS

  3. Không xảy ra redirect loop

  4. Không có mixed content

  5. Cấu hình rõ ràng, dễ kiểm soát

Nguyên tắc:

Một domain – một chuẩn truy cập – một cách redirect.


3. Kiến trúc HTTP → HTTPS đúng cách

3.1. Mô hình chuẩn khuyến nghị

HTTP:

  • Không xử lý nội dung

  • Không cấu hình phức tạp

  • Chỉ làm một việc: redirect

HTTPS:

  • Phục vụ toàn bộ website

  • Có cấu hình đầy đủ


4. Cấu hình redirect HTTP → HTTPS chuẩn

4.1. Server block cho HTTP (port 80)

Ví dụ cấu hình chỉ để redirect:

server {
   listen 80;
   server_name cntt.it;
   return 301 https://$host$request_uri;
}

Giải thích:

  • 301: redirect vĩnh viễn (SEO-friendly)

  • $host$request_uri: giữ nguyên domain và đường dẫn

Nguyên tắc:

Không đặt root, không đặt location phức tạp trong HTTP server block.


5. Cấu hình server block HTTPS chuẩn

Ví dụ HTTPS server block:

server {
   listen 443 ssl http2;
   server_name cntt.it;
   root /var/www/cntt-it/public;
   index index.php index.html;
   ssl_certificate     /etc/letsencrypt/live/cntt.it/fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live/cntt.it/privkey.pem;
   access_log /var/log/nginx/cntt-it.access.log;
   error_log  /var/log/nginx/cntt-it.error.log;
   location / {
       try_files $uri $uri/ =404;
   }
}

Ở bước này:

  • Chưa cấu hình PHP

  • Chưa cấu hình header nâng cao

  • Tập trung vào HTTPS đúng và ổn định


6. Chọn chuẩn www hay non-www và redirect đúng cách

6.1. Quyết định chuẩn duy nhất

Ví dụ chọn non-www (cntt.it) là chuẩn.

6.2. Redirect www → non-www (HTTPS)

Mình cấu hình redirect này ở trang quản lý tên miền. Nhưng nếu bạn không có quyền truy cập thì có thể làm ở nginx nhé.
 
server {
   listen 443 ssl;
   server_name www.cntt.it;
   ssl_certificate     /etc/letsencrypt/live/cntt.it/fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live/cntt.it/privkey.pem;
   return 301 https://cntt.it$request_uri;
}

Nguyên tắc:

Chỉ redirect ở một nơi duy nhất, tránh chồng redirect.


7. Tránh lỗi redirect loop – lỗi rất hay gặp

7.1. Nguyên nhân phổ biến

  • Redirect HTTP → HTTPS ở nhiều nơi

  • CMS (Drupal, WordPress) tự redirect

  • Proxy / CDN redirect thêm một lớp

  • Cấu hình if/return không rõ ràng

7.2. Cách phòng tránh

  • HTTP server block: chỉ redirect

  • HTTPS server block: không redirect vòng

  • Không dùng nhiều if trong Nginx

  • Test từng bước sau mỗi thay đổi


8. Xử lý mixed content

8.1. Mixed content là gì?

Mixed content xảy ra khi:

  • Website chạy HTTPS

  • Nhưng load tài nguyên HTTP (CSS, JS, image)

Trình duyệt sẽ:

  • Cảnh báo

  • Hoặc chặn nội dung


8.2. Cách xử lý

  • Dùng URL tương đối (// hoặc /path)

  • Cấu hình CMS sử dụng HTTPS tuyệt đối

  • Kiểm tra source code frontend

HTTPS chuẩn:

Không được phép tồn tại HTTP trong tài nguyên tải về.


9. Kiểm tra HTTPS sau khi cấu hình

9.1. Kiểm tra thủ công

  • Truy cập:

    • http://domain → phải redirect sang HTTPS

    • https://domain → hoạt động bình thường

  • Kiểm tra biểu tượng khóa trên trình duyệt


9.2. Kiểm tra bằng công cụ dòng lệnh

 
curl -I http://cntt.it

Kết quả mong đợi:

HTTP/1.1 301 Moved Permanently Location: https://cntt.it/... 

10. Những sai lầm phổ biến khi cấu hình HTTPS

  • Để cả HTTP và HTTPS cùng phục vụ nội dung

  • Redirect không nhất quán

  • Vừa redirect ở Nginx, vừa redirect ở CMS

  • Không test sau khi chỉnh

Những lỗi này khiến:

Website “có HTTPS” nhưng vẫn không an toàn và không ổn định.


11. Checklist HTTPS chuẩn production

  •  HTTP chỉ dùng để redirect

  •  HTTPS là chuẩn duy nhất

  •  Không redirect loop

  •  www / non-www thống nhất

  •  Không có mixed content

  •  Test đầy đủ trước khi áp dụng


12. Bài tiếp theo

Trong Bài 24, chúng ta sẽ tiếp tục hoàn thiện bảo mật Web Server:

Các lỗi SSL/HTTPS thường gặp và cách xử lý

Bài này sẽ tổng hợp:

  • Các lỗi thực tế hay gặp

  • Nguyên nhân gốc

  • Cách khắc phục an toàn cho production