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 ~.google. ~.bing. ~.yahoo. .domain.com *.domain.com;
     if ($invalid_referer) {
        return   403;
    }
}

Nếu bạn muốn chặn sử dụng ảnh trong 1 thư mục cụ thể:

location /wp-content/ {
     valid_referers none blocked ~.google. ~.bing. ~.yahoo. .domain.com *.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 ~.google. ~.bing. ~.yahoo. .domain.com *.domain.com;
     if ($invalid_referer) {
        rewrite (.*)\.(jpg|jpeg|png|gif)$ http://www.domain.com/images/warning.jpg;
    }
}

Lưu ý: Nếu trong cấu hình Nginx của website đã tồn tại đoạn cấu hình riêng về file hình ảnh/video thì bạn phải gộp chung với đoạn cấu hình đó chứ không tách riêng rẽ. Ví dụ đối với HocVPS Script:

location ~* \.(3gp|gif|jpg|jpeg|png|ico|wmv|avi|asf|asx|mpg|mpeg|mp4|pls|mp3|mid|wav|swf|flv|exe|zip|tar|rar|gz|tgz|bz2|uha|7z|doc|docx|xls|xlsx|pdf|iso|eot|svg|ttf|woff)$ {
		valid_referers none blocked ~.google. ~.bing. ~.yahoo. hocvps.com *.hocvps.com;
		if ($invalid_referer) {
			return 403;
			}
		gzip_static off;
		add_header Pragma public;
		add_header Cache-Control "public, must-revalidate, proxy-revalidate";
		access_log off;
		expires 30d;
		break;
        }

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;
}

Cài WordPress trong 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 /wordpress/ {
    try_files $uri $uri/ /wordpress/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

Comment của bạn

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

140 Comments

  1. đức 31 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 31 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 31 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

  2. Nguyễn Hoàng Phúc 18 comment

    Mình đã làm theo hướng dẫn bài https://hocvps.com/rule-nginx/ nhưng không hiểu sao lại không chạy được. line 79

    http://imgur.com/a/Nj0Vm

    mình đã thử sửa lại nhưng vẫn chạy không được

    http://imgur.com/a/w1O4z

    đã lưu đúng đường dẫn

    http://imgur.com/a/NnJc0

    nhưng sau khi chạy vẫn báo lỗi “No input file specified” mặc dù đường dẫn file rewrite đúng. Mình sử dụng vpssim. Mong bạn giúp đỡ

          1. Nguyễn Hoàng Phúc 18 comment

            Mình sơ suất quá, cảm ơn bạn. Mình đã sửa lại

            http://imgur.com/a/xdYND

            giờ vào link /ohs.php thì chuyển sang /ohs nhưng nó lại không hiện nội dung của file ohs.php và báo lỗi “No input file specified”

          2. Việt Phương Moderator

            Bạn dùng location /ohs rewrite sang /ohs.php mà path lúc đó là /ohs/ohs.php thì báo lỗi không thấy file là đúng
            Bạn thử rewrite ^/ovh$ /ovh.php last; xem, không cần đặt trong block location

          3. Nguyễn Hoàng Phúc 18 comment

            Sao vẫn không được bạn ơi. Mình đã thử xóa cache rồi

          4. Nguyễn Hoàng Phúc 18 comment

            Mình vừa restart lại server thì chạy rồi. Cảm ơn nhiều bạn nha :))

  3. Noname 18 comment

    sau khi thêm vào nó gây lỗi thế này Job for nginx.service failed because the control process exited with error code. See “systemctl status nginx.service” and “journalctl -xe” for details. mình dùng centon 7

    1. Việt Phương Moderator

      ystemctl status nginx.service -l và nginx -t hiện kết quả gì bạn

        1. Việt Phương Moderator

          Bạn chạy lệnh check tình trạng Nginx sẽ giúp báo bạn sai ở dòng nào trong Conf nhé, khi đó bạn tự xem sửa lại chứ code gốc của bạn mình không rõ

          1. Noname 18 comment

            mình chỉ thêm dòng
            location ~ .(gif|png|jpe?g)$ {
            valid_referers none blocked .xxx.com;
            if ($invalid_referer) {
            return 403;
            }
            }
            vào là bị lỗi khởi động lại bị vậy

          2. Noname 18 comment

            Nên mình bỏ ra lưu lại khởi động lại thì bt à chỉ có cái là thêm vào bị vậy mà chẳng biết thêm sao cho nó đúng theo ngix nó báo @@

          3. Noname 18 comment

            tìm trên mạng có đứa bị nó nói
            Nguyên nhân là tại dòng này, mình không để ý đến nói:
            #include /etc/nginx/conf/all.conf; mà chẳng hiểu nghĩa là gì 🙁 ai rành mới biết

          4. Việt Phương Moderator

            1. Nginx Conf bạn có dòng #include /etc/nginx/conf/all.conf này đâu mà lỗi do nó được. Chưa kể, việc # thì Nginx đã không đọc dòng đó rồi
            2. Như mình đã nói, sai gì Nginx sẽ báo đó.
            Job for nginx.service failed because the control process exited with error code. See “systemctl status nginx.service” and “journalctl -xe” for details
            Bạn gg dịch cũng hiểu mà, chạy systemctl status nginx.service -l để thêm thông tin

          5. Noname 18 comment

            mình chạy
            systemctl status nginx.service -l
            ● nginx.service – nginx – high performance web server
            Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
            Active: active (running) since Tue 2017-07-25 10:55:38 +07; 53min ago
            Docs: http://nginx.org/en/docs/
            Process: 2784 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
            Process: 2822 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
            Process: 2820 ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
            Main PID: 2824 (nginx)
            CGroup: /system.slice/nginx.service
            ├─2824 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.con
            ├─2825 nginx: worker process
            ├─2826 nginx: worker process
            └─2827 nginx: cache manager process

            Jul 25 10:55:38 vultr.guest systemd[1]: Starting nginx – high performance web server…
            Jul 25 10:55:38 vultr.guest nginx[2820]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
            Jul 25 10:55:38 vultr.guest nginx[2820]: nginx: configuration file /etc/nginx/nginx.conf test is successful
            Jul 25 10:55:38 vultr.guest systemd[1]: Started nginx – high performance web server.

            nhưng không hiểu là sai gì vì thêm vào thế 😀 quan trọng là mình không biết thêm chỗ nào hay thế nào cho đúng 😀

          6. Việt Phương Moderator

            nginx: configuration file /etc/nginx/nginx.conf test is successful thì hiện tại có sai gì đâu. Nginx chạy hoàn toàn bình thường

  4. fususu 30 comment

    Mình muốn redirect tất cả các file ảnh bị lỗi 404 (không tồn tại)
    thành 1 file default duy nhất, mình ném cái dode search được trên google này vào vhost mà ko dc 🙁

    server {
    listen 443 ssl http2;

    location ~* \.(png|jpg|gif)$ {
    try_files $uri $uri/ https://fususu.com/default.png;
    }

    }

    1. Việt Phương Moderator

      1. Nhìn rule bạn thì xử lý toàn bộ ảnh rồi đâu phải mỗi ảnh lỗi?
      2. Trong Nginx Conf của bạn có thể còn đoạn khác cũng quy định về png/jpg/gif. Khi đó, bạn phải gộp không nó xung đột

        1. Việt Phương Moderator

          Hiện tại ảnh lỗi của bạn hiển thị như thế nào? Nó là thành 404 Error chứ đâu phải show cái gì

          1. Việt Phương Moderator

            Thế thì bạn dùng bên Redirect Link 404 ý, phần cuối trong bài viết này

  5. fususu 30 comment

    Hi

    Mình đang cài cái mautic để gửi mail, nó có 1 file gọi là mtc.js để tracking, ở đường dẫn https://mt.fususu.com/mtc.js và được tự động tạo ra qua php chứ không phải là một file cố định. Tức là trên vps thì file đó sẽ không thấy, nhưng truy cập vào thì vẫn sẽ được. Song phải config nginx rule thế nào đó… (cấu hình của mình ở đây: :https://www.mautic.org/community/index.php/8458-form-won-t-show-via-javascrip-404-not-found/p1#p26181)

      1. fususu 30 comment

        Hôm trước nhờ bạn là fix cái vụ cpu cao, giờ mình xử dc rồi, do xài mấy plugin nặng.
        Còn cái này là mình cài mới tinh trên một vps có sử dụng hocvps script. Song config cho thằng Mautic này mãi ko xong vụ này nên không track mail open được ^^! Cái lỗi mình gặp nhiều người cũng gặp ở trên forum của họ. Mà cái Mautic này gửi mail hay lắm, free mà chất, Luân nghiên cứ xem 🙂

  6. QUY 1 comment

    Của em vẫn không hoạt động là do tại sao nhỉ e cover dạng ntn

    # nginx configuration

    location /acc {
    rewrite ^/acc-([0-9]+)$ /view.php?id=$1;
    rewrite ^/acc-([0-9]+)/$ /view.php?id=$1;
    }

    location = /user/login {
    rewrite ^(.*)$ /login.php;
    rewrite ^(.*)$ /login.php;
    }

    location = /user/login/index.php {
    rewrite ^(.*)$ /login.php;
    }

    location = /user/logout {
    rewrite ^(.*)$ /logout.php;
    rewrite ^(.*)$ /logout.php;
    }

    location /lich {
    rewrite ^/lich-su-nap$ /cardhistory.php;
    rewrite ^/lich-su-nap/$ /cardhistory.php;
    rewrite ^/lich-su-mua$ /history.php;
    rewrite ^/lich-su-mua/$ /history.php;
    }

    location /nap {
    rewrite ^/nap-tien$ /napthe.php;
    rewrite ^/nap-tien/$ /napthe.php;
    }

    location /huong {
    rewrite ^/huong-dan-mua-acc/$ /huongdanmuacc.php;
    rewrite ^/huong-dan-mua-acc$ /huongdanmuacc.php;
    rewrite ^/huong-dan-bao-mat-tk$ /huongdanbaomat.php;
    rewrite ^/huong-dan-bao-mat-tk/$ /huongdanbaomat.php;
    }

    location = /login.html {
    rewrite ^(.*)$ /login.php;
    }

    location = /user {
    rewrite ^(.*)$ /fbconfig.php;
    rewrite ^(.*)$ /fbconfig.php;
    }

  7. Tuấn Anh 18 comment

    Làm sao để thêm subdomain bất kỳ vào nginx vậy mọi người, nôm na là wildcard dns.

    Ở tên miền mình đã trỏ A record * và ip của vps

    Khi vào bằng subdomain bất kỳ dạng abc.maindomain.com thì nó hiện lỗi “Trang này hiện không hoạt động”. nhưng khi ping subdomain đó vẫn ra ip của vps.

    Thanks!