Tuesday, 5 August 2014

[NGINX] luật matching khi chọn location để xử lý 1 request

Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
khi nhận được 1 request, NGINX cần chọn location để xử lý request đó, quá trình này gọi là matching.

Vài từ khoá
Các dấu = ~ ~* ^~ gọi là các modifier.
Một location có thể được định nghĩa bởi một "prefix string" hoặc regular expression (regex - nếu không biết regex là gì hãy Google, giải thích khái niệm này nằm ngoài tầm của bài viết).
location /images  {
} # là một location dùng "prefix string"

location ~* \.(gif|jpg|jpeg)$ {
} # là một location dùng regex.
Regex
Để sử dụng các regex, cần dùng modifier ~ hoặc ~*.
~ : regex matching có phân biệt hoa thường. Tức
location meomeo
khác với
location MeoMeo
~*: regex matching không phân biệt hoa thường.

Thứ tự xử lý

1. Kiểm tra tất cả các prefix string location, NHỚ cái match dài nhất.
Tức nếu có:
location / {
}

location /image {
}
Thì một request xxx.com/image/logo.gif sẽ được xử lý ở location /image, bởi / match nhưng /image match dài hơn.

2. Sau khi kiểm tra các prefix string location, NGINX tiếp tục kiểm tra các regex, theo thứ tự nó xuất hiện trong configuration file. Quá trình kiểm tra này dừng lại ngay khi có 1 regex nào match với request. Nếu không có regex nào match, NGINX sẽ sử dụng prefix string location đã NHỚ nói trên.

Modifier ^~ và = 
Nếu  prefix string dài nhất match 1 request, và string đó dùng modifier ^~ thì NGINX sẽ dùng luôn prefix string đó và không kiểm tra các regex nữa.
Sử dụng modifier = để matching chính xác, nếu một location dùng modifier = match request, NGINX sẽ dùng luôn location đó và không thực hiện maching nữa.


Bài viết dựa trên document của NGINX ở bản 1.4

Tài liệu tham khảo
http://nginx.org/en/docs/http/request_processing.html
http://nginx.org/en/docs/http/ngx_http_core_module.html