Khác với Apache, Nginx không sử dụng file .htaccess nên khi bạn cần rewrite url sẽ phải convert qua rule của Nginx. Trong bài viết này, mình sẽ đưa ra một số ví dụ các rule của Nginx sử dụng để rewrite url, redirect và một số cấu hình cần thiết khác.

Khi sử dụng, bạn hãy thêm vào file cấu hình conf của tên miền, với HocVPS Script thì các file cấu hình này thường nằm trong thư mục /etc/nginx/conf.d/

Canonical URLs

Đảm bảo website của bạn được search engine index một đường dẫn duy nhất.

www.mydomain.com -> mydomain.com

Redirect toàn bộ request từ www.mydomain.com sang mydomain.com, kèm theo cả đường dẫn và tham số phía sau url.

server {
      server_name www.mydomain.com;
      rewrite ^(.*) $scheme://mydomain.com$1 permanent;
}

mydomain.com -> www.mydomain.com

Redirect toàn bộ request từ mydomain.com sang www.mydomain.com, kèm theo cả đường dẫn và tham số phía sau url.

server {
      server_name mydomain.com;
      rewrite ^(.*) $scheme://www.mydomain.com$1 permanent;
}

SSL Sites

Google hiện tại đang sử dụng SSL là một yếu tố xếp hạng, nếu bạn sử dụng các site eCommerce, hãy sử dụng SSL.

Rule bên dưới sẽ redirect tất cả request sử dụng HTTPS, trường hợp này giả sử bạn sử dụng www.domain.com làm tên miền chính.

# Tells the browser to always force SSL.
if ($scheme != "https") {
    rewrite ^ https://www.mydomain.com$uri permanent;
}
if ($host != "www.mydomain.com") {
    rewrite ^ https://www.mydomain.com$uri permanent;
}

Bắt buộc sử dụng SSL

Bắt buộc phải sử dụng SSL với một đường dẫn bất kỳ:

set $redirect false; 
if ($request_uri ~ ^/manager(\/)?$ ) { 
    set $redirect true; 
} 
if ($scheme = https) { 
    set $redirect false; 
} 
if ($redirect = true) { 
    return 301 https://www.domain.com$request_uri; 
}

Tối ưu Browser Caching

Bằng việc sử dụng browser caching, website của bạn sẽ load nhanh hơn rất nhiều kể từ sau lần visit đầu tiên:

location ~* \.(?:ico|css|js|jpe?g|png|gif|svg|pdf|mov|mp4|mp3|woff)$ {
    expires 7d;
    add_header Pragma public;
    add_header Cache-Control "public";
    gzip_vary on;
}

Giới hạn IP truy cập

Trong trường hợp bạn muốn chỉ một số IP được phép truy cập, hãy sử dụng rule bên dưới:

location /manager/ {
    # allow anyone in 192.168.1.0/24
    allow   192.168.1.0/24;
    
    # allow one workstation
    allow 127.0.0.1;

    # drop rest of the world 
    deny all;
}

Block IP

Khác với trường hợp chỉ cho phép một số IP được truy cập vào, rule bên dưới sẽ block một số IP xác định trước.

location /manager/ {
    # block one workstation
    deny 192.168.1.1;

    # block anyone in 127.0.1.1/24
    deny   127.0.1.1/24;

    # allow rest of the world 
    allow all;
}

Ngăn những site khác sử dụng hình ảnh

Với đoạn code dưới, bạn sẽ hạn chế những site khác sử dụng hình ảnh trực tiếp:

location ~ .(gif|png|jpe?g)$ {
     valid_referers none blocked .domain.com;
     if ($invalid_referer) {
        return   403;
    }
}

Nếu bạn muốn thay vì báo lỗi mà hiển thị một hình ảnh khác, hãy  sử dụng code bên dưới:

location ~ .(gif|png|jpe?g)$ {
     valid_referers none blocked .domain.com;
     if ($invalid_referer) {
        rewrite (.*)\.(jpg|jpeg|png|gif)$ http://www.domain.com/images/warning.jpg;
    }
}

Bảo vệ thư mục bằng mật khẩu

Đầu tiên, bạn cần sử dụng tool này để tạo file .htpasswd, sau đó dùng đoạn code bên dưới, giả sử mình lưu ở /root/.htpasswd

location /protectme/ {
    auth_basic "Restricted";
    auth_basic_user_file /root/.htpasswd;
}

Rewrite URL

Ví dụ bên dưới giả sử bạn muốn rewrite (không phải redirect) đường dẫn http://domain.com/listing/123 thành http://domain.com/listing.php?id=123

rewrite ^/listing/(.*)$ /listing.php?id=$1 last;

(.*) ở đây là regular expression, đại diện cho bất kỳ ký tự nào. Nếu thêm regular expression, bạn sử dụng tương ứng $2, $3

Redirect URL cũ sang URL mới

Redirect /someoldarticle.html sang /some/newarticle.html

rewrite ^/someoldarticle\.html /some/newarticle.html permanent;

Redirect domain cũ sang domain mới

Redirect http://olddomain.com và toàn bộ đường dẫn con sang domain mới http://newdomain.com

rewrite ^(.*) http://newdomain.com$1 permanent;

Redirect IP server sang domain bất kỳ

Mục đích khi truy cập vào IP server, thay vì hiển thị nội dung mặc định của Nginx, người dùng sẽ được tự động redirect đến một địa chỉ website nào đó, ví dụ domain.com.

Bạn hãy mở file cấu hình domain chính, tìm dòng nào có nội dung là listen 80 default_server; thì thay bằng listen 80; (xóa default_server). Tiếp theo, copy paste đoạn cấu hình dưới lên trên cùng file .conf, khởi động lại Nginx là xong:

server {
        listen       80  default_server;
        server_name  _;

        rewrite ^(.*) http://domain.com$1 permanent;
}

Chạy WordPress ở Sub-folder

Để chạy được WordPress ở thư mục con, bạn hãy thêm đoạn code sau vào đằng trước block location / { ... }

location /demo/ {
    try_files $uri $uri/ /demo/index.php?$args;
}

Hiển thị nội dung thư mục

Nếu thư mục không có file index, khi truy cập bạn có thể gặp thông báo lỗi “403 Forbidden“, không hiển thị những file bên trong đó. Để cho phép người dùng xem được thư mục này, bạn hãy chỉnh lại autoindexon.

location / {
    autoindex on;
}

hoặc chỉnh lại là off để không hiển thị nội dung thư mục:

location / {
    autoindex off;
}

Thông thường link 404 sẽ hiển thị thông báo lỗi của Nginx hoặc trang 404 của WordPress. Nếu bạn muốn hiển thị nội dung của trang chủ, có thể thêm đoạn code sau lên trước block location / { ... }

error_page 404 /index.php;

Nội dung index.php sẽ xuất hiện, tuy nhiên header status vẫn là 404. Nếu muốn header 200 thì bạn chuyển đoạn code thành: error_page 404 =200 /index.php;

Ngoài ra có một số tool tự động convert sang rule Nginx bạn có thể tham khảo thêm như:

  1. http://www.anilcetin.com
  2. http://labs.gidix.de/nginx/
  3. https://winginx.com/en/htaccess

106 Comments

  1. đức 29 comment

    1) vậy làm sao e biết đc file config của domain nào sẽ có tên là gì? hay nó sẽ có cấu trúc là domain.conf??

    3) tức là e vẫn có thể sử dụng file htaccess đó nhưng phải convert trc? có bài hướng dẫn convert ko em xem với

    e đang chạy folder con kiểu domain/folder, vào được home nhưng khi ấn vào bài viết lại ghi “file not found”.
    -> vậy lỗi này có phải là do file htacess chưa được convert ko?
    -> hoặc là e thấy bảo là wp muốn chạy ở folder con phải config?

    demo lỗi: http://ducmu.info/blog

    1. đức 29 comment

      1) có vẻ đúng cấu trúc như thế thật, e đánh nano /etc/nginx/conf.d/ducmu.info.conf

      nó đã ra file config của domain ducmu.info

      3) e gọi được ra file đó rồi e sửa theo hướng dẫn thành như này, để chạy ở folder ducmu.info/blog nhưng vẫn lỗi khi ấn vào các link bài viết ạ 🙁

      #
      # ducmu.info configuration
      #
      server {
      listen 80;
      server_name ducmu.info;

      location / {
      root /home/ducmu.info/public_html;
      index index.php index.html index.htm;
      try_files $uri $uri/ /index.php?q=$uri&$args;
      }
      location /blog/ {
      try_files $uri $uri/ /blog/index.php?$args;
      }
      error_page 404 /404.html;
      location = /404.html {
      root /home/ducmu.info/public_html;
      }

      error_page 500 502 503 504 /50x.html;
      location = /50x.html {
      root /home/ducmu.info/public_html;
      }

      # pass the PHP scripts to FastCGI server
      #
      location ~ \.php$ {
      root /home/ducmu.info/public_html;
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      include fastcgi_params;
      }
      }

      1. Việt Phương Moderator

        1. Do quy định từng hệ thống. Hoặc nếu hệ thống bạn tự thiết lập thì file Conf bạn hoàn toàn có thể để tên như thế nào cũng được, cho tiện quản lý
        3. File Nginx Conf của bạn không ổn. Quá nhiều root web và block không đóng mở trong block tổng 80 {}
        Ví dụ nếu cấu hình đơn giản thì chỉ là: https://pastebin.com/0wApDMtL

        1. đức 29 comment

          trời ơi sau khi mà thay đoạn code của a vào file config domain thì

          1) em dùng lệnh service nginx restart để khởi động lại nginx

          nhưng mà sau đó web của e die hết ạ 🙁
          IP: http://45.32.120.170
          demo web: http://ducmu.info/blog/

          e cuống quá dùng lệnh sudo yum install nginx để cài lại nginx nhưng vẫn die ạ, e phải làm sao giờ??

          2) ngoài ra e còn bị lỗi file manager của hocvps ko giải nén được file, e định sẽ cài lại hocvps thì e cứ dùng lệnh cài đè lại hay e phải xóa toàn bộ vps đi làm từ đầu ạ?

          3) mà chạy domain ở sub domain theo bài này nói là dạng sub.domain hay là dạng domain/folder đấy ạ??

          cái e cần là dạng domain/folder chạy đc ý

          1. Việt Phương Moderator

            1. Lỗi thông báo như thế này không phán đoán được rồi bạn à. Bạn check service nginx status với nginx -t. Hoặc sau bạn sửa Nginx Conf thì cứ backup trước. Gặp lỗi thì bạn restore lại Conf cũ là được.
            2. Bạn reinstall VPS để cài lại từ đầu nhé. Giải nén sau bạn cứ dùng lệnh trên SSH nhé.
            3. Trong bài viết đề cập rõ ràng là Chạy WordPress ở Sub-folder nhé bạn

Comment của bạn

Your email address will not be published. Required fields are marked *