Viblo CTF
+16

Dynamic Routing trong NGINX

Tiếp nối bài viết trước, Cấu hình Nginx Server như thế nào?. Trong bài viết này, mình sẽ giới thiệu về Dynamic Routing trong NGINX.

1. Prefix match

Mình sẽ cấu hình file nginx.conf như sau:

events {

}

http {

    include /etc/nginx/mime.types; 

    server {
        listen 80;
        server_name nginx-tutorial.test;

        location /user {
            return 200 "Hello User!\n";
        }        
    }
}

Và hãy nhớ rằng, mỗi khi cấu hình xong hãy sử dụng câu lệnh:

nginx -t # Kiểm tra xem file cấu hình có bị lỗi không?
nginx -s reload # Khởi động lại Nginx 

Block directive location luôn nằm trong block directive server, có thể có nhiều location ở trong server.

Bây giờ mình gửi request tới nginx-tutorial.test/uesr, kết quả nhận được là:

Bây giờ, mình gửi một request khác tới nginx-tutorial.test/user1, kết quả nhận được là:

Kết quả giống như nhau. Bởi vì khi mình sử dụng location /user, NGINX sẽ match tất cả URI bắt đầu bằng /user và trả về cùng 1 response là: Hello User!. Đây được gọi là prefix match.

2. Exact match

Mình sẽ cấu hình file nginx.conf như sau:

events {

}

http {

    include /etc/nginx/mime.types; 

    server {
        listen 80;
        server_name nginx-tutorial.test;

        location = /user {
            return 200 "Hello User!\n";
        }        
    }
}

Và gửi request tới nginx-tutorial.test/uesr, kết quả là:

Và nếu mình gửi request tới nginx-tutorial.test/uesr1, kết quả là:

Như vậy là 2 kết quả khác hẳn nhau, không giống như ở prefix match. Khi mình sử dụng location = /user, thì có nghĩa NGINX sẽ chỉ match với URI là /user và trả về status code 200, nội dung là Hello User!. Nếu gửi những request khác, thì sẽ trả về status code là 404. Đây được gọi là exact match.

3. Regex match

Ngoài 2 kiểu là prefix match, và exact match, thì có một kiểu nữa là regex match. NGINX sẽ match với những URI thỏa mãn biểu thức chính quy mà chúng ta quy định. Ví dụ, mình sửa đổii file nginx.conf như sau:

events {

}

http {

    include /etc/nginx/mime.types; 

    server {
        listen 80;
        server_name nginx-tutorial.test;

        location ~ /user[0-9] {
            return 200 "Hello User!\n";
        }        
    }
}

Khi mình sử dụng location ~ /user[0-9], NGINX sẽ match với những URI thoả mãn biểu thức chính quy user[0-9] và trả về status code là 200 với nội dung là: Hello User!. Ví dụ:

Nếu những URI, không thỏa mãn biểu thức chính quy, thì NGINX sẽ trả về kết quả như sau:

Có một chú ý nữa là, NGINX sẽ ưu tiên regex match trước, rồi mới đến prefix match. Có nghĩa là, nếu URI thỏa mãn regex matchprefix match thì sẽ trả về response của regex match. Cụ thể, mình sửa file nginx.conf như sau:

events {

}

http {

    include /etc/nginx/mime.types; 

    server {
        listen 80;
        server_name nginx-tutorial.test;

        location  /user1 {
                return 200 "This is prefix match.\n";
        }

        location ~ /user[0-9] {
            return 200 "This is regex match.\n";
        }        
    }
}

Và khi mình gửi request tới nginx-tutorial.test/user1, kết quả trả về là:

Response trả về là của regex match.

NGINX cho phép chúng ta thay đổi thứ tự ưu tiên này, bằng cách sử dụng ^~ trong prefix match, cụ thể như sau:

events {

}

http {

    include /etc/nginx/mime.types; 

    server {
        listen 80;
        server_name nginx-tutorial.test;

        location ^~ /user1 {
                return 200 "This is prefix match.\n";
        }

        location ~ /user[0-9] {
            return 200 "This is regex match.\n";
        }        
    }
}

Và một lần nữa, mình gửi request tới nginx-tutorial.test/user1, kết quả trả về là response của prefix match :

4. Biến trong NGINX

Biến trong NGINX cũng giống như trong các ngôn ngữ lập trình khác. Chúng ta có thể dùng directive set để khai báo biến và gán giá trị cho nó, với cú pháp như sau:

set $<variable_name> <variable_value>

Và NGINX cũng cung cấp sẵn một số biến, các bạn có thể tham khảo thêm tại đấy: Alphabetical index of variables .

Biến trong NGINX có 3 kiểu là:

  • String
  • Integer
  • Boolean

Mình cấu hình file nginx.conf như sau:

Và gửi một request tới: nginx-tutorial.test/user?name=DucLS, kết quả trả về là:

Các biến $host, $uri, $args là những biến có sẵn NGINX cung cấp.

  • $host: Lưu trữ hostname của server.
  • $uri: Lưu trữ URI.
  • $args: Lưu trữ query prams.

5. Redirect và Rewrite

Mình sửa file nginx.conf như sau:

events {

}


http {
    include /etc/nginx/mime.types;

    server {
	listen 80;

	server_name nginx-tutorial.test;

	root /var/www/html/nginx-handbook-projects/static-demo;

	location = /index_page {
	   return 307 /index.html;
	}
	
	location = /about_page {
	   return 307 /about.html;
	}
    }
}

Và khi mình gửi request tới nginx-tutorial.test/index_page, NGINX sẽ redirect mình tới nginx-tutorial.test/index.html. Cụ thể như sau:

NGINX trả về với status code là 307, và điều hướng tới nginx-tutorial.test/index.html. Khi sử dụng redirect, NGINX sẽ thay đổi URL trên browser. Ngoài redirect, còn có một cách khác là sử dụng rewrite.

Với rewrite, mình sẽ sửa file nginx.conf như sau:

events {

}


http {
    include /etc/nginx/mime.types;

    server {
	listen 80;

	server_name nginx-tutorial.test;

	root /var/www/html/nginx-handbook-projects/static-demo;

	rewrite /index_page /index.html;

	rewrite /about_page /about.html;
    }
}

Khi mình gửi request tới nginx-tutorial/test/index_page, kết quả sẽ như sau:

Như các bạn có thể thấy, NGINX trả về với status code là 200, với nội dung của page index.html nhưng URL lại không bị thay đổi.

Đó là sự khác nhau giữa sử dụng redirectrewrite. Khi sử dụng redirect, NGINX sẽ thay đổi URL trên browser, còn đối với rewrite, NGINX sẽ ngầm điều hướng tới page mà mình config, và giữ nguyên URL.

6. Kết thúc

Trong bài viết này mình đã giới thiệu về Dynamic Routing trong NGINX, và 3 dạng của nó là:

  • prefix match.
  • exact match.
  • regex match.

Biến trong NGINX, cách khai báo biến, và một số biến NGINX cung cấp sẵn.

Sự khác nhau giữa redirectrewrite, và cách sử dụng.

Trong bài tiếp theo, mình sẽ hướng dẫn các bạn Cách cấu hình NGINX thành Reverse Proxy.


All Rights Reserved