Khởi tạo Vị trí HTTP trong Nginx
Xử lý vị trí HTTP trong mã nguồn Nginx
static ngx_int_t
khoi_tao_vi_tri_http(ngx_conf_t *cau_hinh, ngx_http_core_srv_conf_t *conf_server,
ngx_http_core_loc_conf_t *conf_location_cha)
{
ngx_uint_t so_luong;
ngx_queue_t *hang_doi, *vi_tri, *ten, cuoi;
ngx_http_core_loc_conf_t *conf_vi_tri;
ngx_http_location_queue_t *hang_vi_tri;
ngx_http_core_loc_conf_t **danh_sach_conf_vi_tri;
#if (NGX_PCRE)
ngx_uint_t so_luong_regex;
ngx_queue_t *regex;
#endif
vi_tri = conf_location_cha->vi_tri;
if (vi_tri == NULL) {
return NGX_OK;
}
ngx_queue_sort(vi_tri, so_sanh_vi_tri_http);
ten = NULL;
so_luong = 0;
#if (NGX_PCRE)
regex = NULL;
so_luong_regex = 0;
#endif
for (hang_doi = ngx_queue_head(vi_tri);
hang_doi != ngx_queue_sentinel(vi_tri);
hang_doi = ngx_queue_next(hang_doi))
{
hang_vi_tri = (ngx_http_location_queue_t *) hang_doi;
conf_vi_tri = hang_vi_tri->chinh_xac ? hang_vi_tri->chinh_xac : hang_vi_tri->bao_gom;
if (khoi_tao_vi_tri_http(cau_hinh, NULL, conf_vi_tri) != NGX_OK) {
return NGX_ERROR;
}
#if (NGX_PCRE)
if (conf_vi_tri->regex) {
so_luong_regex++;
if (regex == NULL) {
regex = hang_doi;
}
continue;
}
#endif
if (conf_vi_tri->co_ten) {
so_luong++;
if (ten == NULL) {
ten = hang_doi;
}
continue;
}
if (conf_vi_tri->khong_ten) {
break;
}
}
if (hang_doi != ngx_queue_sentinel(vi_tri)) {
ngx_queue_split(vi_tri, hang_doi, &cuoi);
}
if (ten) {
danh_sach_conf_vi_tri = ngx_palloc(cau_hinh->pool,
(so_luong + 1) * sizeof(ngx_http_core_loc_conf_t *));
if (danh_sach_conf_vi_tri == NULL) {
return NGX_ERROR;
}
conf_server->vi_tri_co_ten = danh_sach_conf_vi_tri;
for (hang_doi = ten;
hang_doi != ngx_queue_sentinel(vi_tri);
hang_doi = ngx_queue_next(hang_doi))
{
hang_vi_tri = (ngx_http_location_queue_t *) hang_doi;
*(danh_sach_conf_vi_tri++) = hang_vi_tri->chinh_xac;
}
*danh_sach_conf_vi_tri = NULL;
ngx_queue_split(vi_tri, ten, &cuoi);
}
#if (NGX_PCRE)
if (regex) {
danh_sach_conf_vi_tri = ngx_palloc(cau_hinh->pool,
(so_luong_regex + 1) * sizeof(ngx_http_core_loc_conf_t *));
if (danh_sach_conf_vi_tri == NULL) {
return NGX_ERROR;
}
conf_location_cha->vi_tri_regex = danh_sach_conf_vi_tri;
for (hang_doi = regex;
hang_doi != ngx_queue_sentinel(vi_tri);
hang_doi = ngx_queue_next(hang_doi))
{
hang_vi_tri = (ngx_http_location_queue_t *) hang_doi;
*(danh_sach_conf_vi_tri++) = hang_vi_tri->chinh_xac;
}
*danh_sach_conf_vi_tri = NULL;
ngx_queue_split(vi_tri, regex, &cuoi);
}
#endif
return NGX_OK;
}
Ký hiệu hàm
static ngx_int_t
khoi_tao_vi_tri_http(ngx_conf_t *cau_hinh, ngx_http_core_srv_conf_t *conf_server,
ngx_http_core_loc_conf_t *conf_location_cha)
Giá trị trả về của hàm
- static ngx_int_t:
- static chỉ ra rằng hàm này chỉ có thể được sử dụng trong file hiện tại.
- ngx_int_t là kiểu số nguyên do Nginx định nghĩa, thường trả về:
- NGX_OK(0): Thành công
- NGX_ERROR(-1): Lỗi
Tham số của hàm
- ngx_conf_t *cau_hinh
Con trỏ cấu trúc chứa ngữ cảnh phân tích cấu hình hiện tại.
- ngx_http_core_srv_conf_t *conf_server
Cấu trúc cấu hình cho khối server hiện tại.
- ngx_http_core_loc_conf_t *conf_location_cha
- Tác dụng: Cấu trúc cấu hình cho location cha.
- Các thành viên quan trọng:
- vi_tri: Hàng đợi các location (đối tượng chính mà hàm này xử lý).
- vi_tri_regex: Mảng các location theo biểu thức chính quy (được hàm này điền vào).
- ten: Kiểu phù hợp của location.
- Ý nghĩa: Xử lý mối quan hệ kế thừa của cấu hình location lồng nhau.
Thẻ:
nginx
http
location
PCRE
Đăng vào ngày 17 tháng 6 lúc 03:35