[Nginx] Mẹo cấu hình “if” đồng thời nhiều điều kiện kiểm tra trong Nginx

Có 1 sự thật là Nginx Web server không có hỗ trợ cấu hình điều kiện kiểm tra “if” theo dạng kiểm tra lồng hoặc đồng thời cùng lúc nhiều điều kiện. Ví dụ 1 như :

if ($request_method = POST && -f $request_filename) {
         ...
}


Nginx cũng không hỗ trợ kiểm tra điều kiện if lồng điều kiện if như ví dụ 2 sau :

if ($request_method = POST) {
          if (-f $request_filename) {
          ...
          }
}


Thế là bạn phát hiện ra rằng các điều kiện kiểm tra đồng thời như AND, OR hay NOT không được hỗ trợ bình thường bởi Nginx. Điều này cực kì gây ra những rắc rối khó ăn khó ở trong một số trường hợp nhất định. Vậy nên sau 1 hồi tìm kiếm mình đã tìm ra một mẹo để xử lý vấn đề đó và sẽ được trình bày như sau.


Giải pháp

Chúng ta sẽ giải quyết vấn đề này bằng cách tận dụng cấu hình set biến quy định khi request khớp với 1 điều kiện if.

Ví dụ 3:

server {
          if ($request_uri = /) { 
          set $test A; 
 } 
 
          if ($host ~* cuongquach.com) { 
          set $test "${test}B"; 
 } 
 
          if ($http_cookie !~* "auth_token") { 
          set $test "${test}C"; 
 } 
 
          if ($test = ABC) { 
                   proxy_pass http://cuongquach.com; 
                   break; 
          }
}


Diễn giải :

– Nếu 1 request http tới và nginx phải xử lý nó, khi kiểm tra giá trị “request_uri” thấy khới với điều kiện “if” đầu tiên thì sẽ set giá trị $test = A.
– Đến điều kiện thứ 2 thì phần tên miền “host” = “cuongquach.com” thì sẽ set tiếp giá trị $test = AB .
– Điều kiện if thứ 3 kiểm tra xem trong trường header Cookie có cookie_name là nào không phải là “auth_token” hay không, nếu khớp thì sẽ set giá trị $test = ABC .
– Rồi điều kiện if 4 chính là kiểm tra giá trị $test sau khi đi qua 3 điều kiện “if” trước, nếu khớp cả 3 thì giá trị $test lúc này là “ABC”.


Như vậy chỉ cần sử dụng mẹo set giá trị biến khi khớp các điều kiện “if” so sánh ta sẽ chốt bằng 1 điều kiện cuối cùng nếu giá trị biến đó phù hợp những gì đã kiểm tra.


Đây có thể coi là 1 mẹo để trị vấn đề này của Nginx.

Previous article[ShellScript] 4 chương trình lệnh Linux để biết số lượng dòng của 1 file text
Next article[Linux] 10 ví dụ sử dụng chương trình lệnh “lsof” trên Linux
Bạn đang theo dõi website "https://cuongquach.com/" nơi lưu trữ những kiến thức tổng hợp và chia sẻ cá nhân về Quản Trị Hệ Thống Dịch Vụ & Mạng, được xây dựng lại dưới nền tảng kinh nghiệm của bản thân mình, Quách Chí Cường. Hy vọng bạn sẽ thích nơi này !