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

  1. 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.
  2. ngx_http_core_srv_conf_t *conf_server Cấu trúc cấu hình cho khối server hiện tại.
  3. 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