Khi sử dụng Apache, thông thường để bảo vệ thư mục chúng ta thường sử dụng file .htaccess và .htpasswd. Tuy nhiên, Nginx lại không hỗ trợ .htaccess. Các bạn hãy xem hướng dẫn Basic HTTP Authentication bên dưới để có thể thực hiện bảo vệ thư mục trong Nginx.

Mục tiêu

Bảo vệ thư mục http://example.com/test/ với đường dẫn server là /home/example.com/public_html/test/, file cấu hình Nginx /etc/nginx/conf.d/example.com.conf

1. Tạo file Password

Đầu tiên mình sẽ cần một file để lưu trữ thông tin username/password đăng nhập (đã được mã hóa) bằng cách sử dụng script Python http://trac.edgewall.org/browser/trunk/contrib/htpasswd.py. Ngoài ra, có thể sử dụng Apache’s htpasswd Tool tuy nhiên phải cài thêm vào server nên mình không khuyến khích sử dụng.

Download script về /usr/local/bin và chạy

cd /usr/local/bin
wget http://trac.edgewall.org/export/10791/trunk/contrib/htpasswd.py
chmod 755 /usr/local/bin/htpasswd.py

Giờ mình sẽ tạo file password /home/example.com/public_html/.htpasswd với user hocvps, password hocvpstest. Lưu ý bạn có thể sử dụng file bất kỳ và lưu ở chỗ nào cũng được.

htpasswd.py -c -b /home/example.com/public_html/.htpasswd hocvps hocvpstest

Tham số -c để thực hiện tạo mới file nếu chưa có, nếu file đã tồn tại thì sẽ overwrite do đó mất hết các user từ trước. Trong trường hợp bạn muốn add thêm user nữa thì bỏ tham số -c đi:

htpasswd.py -b /home/example.com/public_html/.htpasswd hocvps2 hocvpstest2

Update: các bạn có thể sử dụng trực tiếp tool này cho nhanh: http://www.htaccesstools.com/htpasswd-generator/

2. Cấu hình Nginx

Mở file cấu hình Nginx

nano /etc/nginx/conf.d/example.com.conf

Thêm nội dung như sau vào trong server { … }

server {
       listen 80;
[...]
       location /test {
                auth_basic "Restricted";
                auth_basic_user_file /home/example.com/public_html/.htpasswd;
       }
[...]
}

Reload Nginx

/etc/init.d/nginx reload

Giờ khi truy cập vào http://example.com/test sẽ có thông báo yêu cầu đăng nhập hiện ra:

Basic HTTP Authentication

Nếu bạn không đăng nhập hoặc đăng nhập sai sẽ báo lỗi:

Basic HTTP Authentication Error

Vậy là ok rồi đó.

Comment của bạn

Lưu ý: tất cả comment đều được kiểm duyệt cẩn thận! Nếu có code bạn hãy up lên pastebin.com rồi để lại link trong comment.

42 Comments

  1. linh 4 comment

    Cho em hỏi ngoài lề xíu em dùng mã này trong file .htaccess để chặn ip giờ muốn chỉ cho phép một số ip nhất định có thể truy cập thì dùng mã nào cám ơn admin
    ORDER ALLOW,DENY
    DENY FROM 192.168.1.1
    DENY FROM 234.45.67.89
    DENY FROM 123.45.67.89
    ALLOW FROM ALL

  2. Bui Anh Quan 5 comment

    Mình dùng cách này để bảo vệ thư mục master chứa linfo để xem thông tin VPS. Tuy vậy khi nhập username và password thì nó lại không cho mình xem thông tin mà tải cái file index.php về. Làm thế nào để sửa vậy bạn?

    1. Việt Phương Moderator

      Cấu hình Nginx bạn post ra nhé. Và vô hiệu hóa phần bảo vệ thư mục thì truy cập hiện thông báo gì?

  3. Quang 2 comment

    làm sao để bảo vệ được file bên trong thư mục nhỉ ?
    ví dụ: thư mục cần bảo vệ là “domain.com/baove”
    làm theo cách của bạn ở trên thì khi vào domain.com/baove ->yêu cầu mật khẩu, đã test ok.
    Nhưng trường hợp mình có file admin.php bên trong thư mục baove, mình dùng trình duyệt gõ thẳng domain.com/baove/admin.php thì nó thực thi luôn chứ không hỏi pass gì nữa cả.
    Bạn có cách nào chặng tất cả file bên trong thư mục luôn không ?

    1. Việt Phương Moderator

      Đây là do bạn đã truy cập được thư mục /baove rồi nên trình duyệt lưu cookie luôn
      Còn nếu bạn chưa truy cập được thì nội dung bên trong cũng không truy cập được đâu

  4. vannguyen 29 comment

    Muốn chọn Apache hoặc Nginx thì chọn ở bước nào vậy Luân, mình có thể thuê bạn cài đặt trọn gói 1 cái VPS (từ bảo mật, tăng tốc độ, các bước cần thiết nhất) cho mình chỉ việc xài được ko?

  5. cuong 28 comment

    “Tech-Demo-Logo.png” has failed to upload.
    Unable to create directory wp-content/uploads/2016/09. Is its parent directory writable by the server?
    cho mình hỏi,minh cài wordpress vào vps nhưng lúc up load lên bi lỗi như trên vậy mong bạn cho mình hỏi mình phải làm thế nào?

  6. Manh 12 comment

    Mình làm các bước như trên nhưng khi đăng nhập vào vẫn báo: “500 Internal Server Error”

      1. Mạnh 2 comment

        Mình đọc thì có dòng này:

        2016/08/02 00:58:41 [crit] 32020#32020: *7 open() “/thumuc/.htpasswd” failed (13: Permission denied), client: 117.0.214.65, server: domain.com, request: “GET /thumucbaove/ HTTP/1.1”, host: “domain.com”

          1. Luân Trần Admin

            Vấn đề ở chỗ đó, bạn thống nhất sử dụng 1 cái thôi chứ

  7. AnHa 1 comment

    Sao mình làm hoài lúc đăng nhập thì cứ down file về vậy admin ?? Xin cám ơn !

  8. Minh Tuấn 6 comment

    Luận ơi cho mình hỏi chút sao website của mình dùng vps ở Vulr nhưng vào web nó cứ đòi bắt nhập pass cổng 80 thế nhỉ

  9. Nguyễn Duy 10 comment

    Bác cho em hỏi sau khi em bảo mật như trên thì em bỏ phpmyadmin script hoặc op.php (theo dõi op cache) thì nó ko chạy đc toàn lên 404 Not Found. Nếu em tạo thư mục abc khác cho code vào vẫn chạy bt nhưng ko có password như trên/ 🙁

  10. Thiện 2 comment

    Giống như đăng nhập vào Router . Mà bác Luân cho hỏi là bác có biết cái trang hayhaytv.vn nó dùng Mã nguồn nào không ?

  11. Thanh 8 comment

    Mình chạy lệnh /etc/init.d/nginx reload thì báo lỗi này là sao nhỉ?

    -bash: /etc/init.d/nginx: No such file or directory

    1. Luân Trần Admin

      Mình fix lỗi www tức là khi add domain có www nó cứ redirect lung tung, ko vào được site. Còn hiện tại site của bạn http://coffeeresearch.net tự redirect sang http://www.coffeeresearch.net chứng tỏ mọi việc đang bình thường, mình nghĩ vấn đề khác. Bạn xem lại danh sách những site đang add trên vps rồi báo lại mình nhé.

  12. Yukio 2 comment

    Bạn cho mình hỏi, cách này theo mình hiểu là 1 site chạy trên 1 vps thì bảo mật theo cách này, nếu mình có 1 server, tạo nhiều user, vậy thì không thể nào mỗi lần tạo user là lại phải add “auth_basic_user_file /home/example.com/public_html/.htpasswd;” , bạn có cách nào tối ưu hơn cho 1 vps có nhiều user không ? Mình xin cảm ơn 🙂

  13. Thuan ga 4 comment

    Luân có thể chỉ cho mình những plugin nào hỗ trỡ bảo mật wordpress trên nginx được ko?
    Ví dụ như thay đổi đường dẫn register hoặc login chẳng hạn…

    1. Luân Trần Admin

      Những vấn đề này ko quan trọng bạn sử dụng server nào cả. Nên vào những group, forum chuyên về WP để hỏi nhé bạn.

      1. vannguyen 29 comment

        Luân ơi, như mình đọc và hiểu thì các plugin hỗ trợ cho wp dùng Nginx rất ít mà chủ yếu xài cho apache phải ko, làm cách nào để biết một plugin là dành cho nginx để cài đặt vào web khi mình xài nginx nhỉ?