⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ngx_http_rewrite_module.c

📁 nginx 反向代理0.7.1版本 用于实现反向代理
💻 C
📖 第 1 页 / 共 2 页
字号:
}static char *ngx_http_rewrite_if(ngx_conf_t *cf, ngx_command_t *cmd, void *conf){    ngx_http_rewrite_loc_conf_t  *lcf = conf;    void                         *mconf;    char                         *rv;    u_char                       *elts;    ngx_uint_t                    i;    ngx_conf_t                    save;    ngx_http_module_t            *module;    ngx_http_conf_ctx_t          *ctx, *pctx;    ngx_http_core_loc_conf_t     *clcf, *pclcf;    ngx_http_script_if_code_t    *if_code;    ngx_http_rewrite_loc_conf_t  *nlcf;    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));    if (ctx == NULL) {        return NGX_CONF_ERROR;    }    pctx = cf->ctx;    ctx->main_conf = pctx->main_conf;    ctx->srv_conf = pctx->srv_conf;    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);    if (ctx->loc_conf == NULL) {        return NGX_CONF_ERROR;    }    for (i = 0; ngx_modules[i]; i++) {        if (ngx_modules[i]->type != NGX_HTTP_MODULE) {            continue;        }        module = ngx_modules[i]->ctx;        if (module->create_loc_conf) {            mconf = module->create_loc_conf(cf);            if (mconf == NULL) {                 return NGX_CONF_ERROR;            }            ctx->loc_conf[ngx_modules[i]->ctx_index] = mconf;        }    }    pclcf = pctx->loc_conf[ngx_http_core_module.ctx_index];    clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];    clcf->loc_conf = ctx->loc_conf;    clcf->name = pclcf->name;    clcf->noname = 1;    if (ngx_http_add_location(cf, &pclcf->locations, clcf) != NGX_OK) {        return NGX_CONF_ERROR;    }    if (ngx_http_rewrite_if_condition(cf, lcf) != NGX_CONF_OK) {        return NGX_CONF_ERROR;    }    if_code = ngx_array_push_n(lcf->codes, sizeof(ngx_http_script_if_code_t));    if (if_code == NULL) {        return NULL;    }    if_code->code = ngx_http_script_if_code;    elts = lcf->codes->elts;    /* the inner directives must be compiled to the same code array */    nlcf = ctx->loc_conf[ngx_http_rewrite_module.ctx_index];    nlcf->codes = lcf->codes;    save = *cf;    cf->ctx = ctx;    if (pclcf->name.len == 0) {        if_code->loc_conf = NULL;        cf->cmd_type = NGX_HTTP_SIF_CONF;    } else {        if_code->loc_conf = ctx->loc_conf;        cf->cmd_type = NGX_HTTP_LIF_CONF;    }    rv = ngx_conf_parse(cf, NULL);    *cf = save;    if (rv != NGX_CONF_OK) {        return rv;    }    if (lcf->captures < nlcf->captures) {        lcf->captures = nlcf->captures;    }    if (elts != lcf->codes->elts) {        if_code = (ngx_http_script_if_code_t *)                   ((u_char *) if_code + ((u_char *) lcf->codes->elts - elts));    }    if_code->next = (u_char *) lcf->codes->elts + lcf->codes->nelts                                                - (u_char *) if_code;    /* the code array belong to parent block */    nlcf->codes = NULL;    return NGX_CONF_OK;}static char *ngx_http_rewrite_if_condition(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf){    u_char                        *p;    size_t                         len;    ngx_str_t                     *value, err;    ngx_uint_t                     cur, last, n;    ngx_http_script_code_pt       *code;    ngx_http_script_file_code_t   *fop;    ngx_http_script_regex_code_t  *regex;    u_char                         errstr[NGX_MAX_CONF_ERRSTR];    value = cf->args->elts;    last = cf->args->nelts - 1;    if (value[1].len < 1 || value[1].data[0] != '(') {        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,                           "invalid condition \"%V\"", &value[1]);        return NGX_CONF_ERROR;    }    if (value[1].len == 1) {        cur = 2;    } else {        cur = 1;        value[1].len--;        value[1].data++;    }    if (value[last].len < 1 || value[last].data[value[last].len - 1] != ')') {        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,                           "invalid condition \"%V\"", &value[last]);        return NGX_CONF_ERROR;    }    if (value[last].len == 1) {        last--;    } else {        value[last].len--;        value[last].data[value[last].len] = '\0';    }    len = value[cur].len;    p = value[cur].data;    if (len > 1 && p[0] == '$') {        if (cur != last && cur + 2 != last) {            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,                               "invalid condition \"%V\"", &value[cur]);            return NGX_CONF_ERROR;        }        if (ngx_http_rewrite_variable(cf, lcf, &value[cur]) != NGX_CONF_OK) {            return NGX_CONF_ERROR;        }        if (cur == last) {            return NGX_CONF_OK;        }        cur++;        len = value[cur].len;        p = value[cur].data;        if (len == 1 && p[0] == '=') {            if (ngx_http_rewrite_value(cf, lcf, &value[last]) != NGX_CONF_OK) {                return NGX_CONF_ERROR;            }            code = ngx_http_script_start_code(cf->pool, &lcf->codes,                                              sizeof(uintptr_t));            if (code == NULL) {                return NGX_CONF_ERROR;            }            *code = ngx_http_script_equal_code;            return NGX_CONF_OK;        }        if (len == 2 && p[0] == '!' && p[1] == '=') {            if (ngx_http_rewrite_value(cf, lcf, &value[last]) != NGX_CONF_OK) {                return NGX_CONF_ERROR;            }            code = ngx_http_script_start_code(cf->pool, &lcf->codes,                                              sizeof(uintptr_t));            if (code == NULL) {                return NGX_CONF_ERROR;            }            *code = ngx_http_script_not_equal_code;            return NGX_CONF_OK;        }        if ((len == 1 && p[0] == '~')            || (len == 2 && p[0] == '~' && p[1] == '*')            || (len == 2 && p[0] == '!' && p[1] == '~')            || (len == 3 && p[0] == '!' && p[1] == '~' && p[2] == '*'))        {            regex = ngx_http_script_start_code(cf->pool, &lcf->codes,                                         sizeof(ngx_http_script_regex_code_t));            if (regex == NULL) {                return NGX_CONF_ERROR;            }            ngx_memzero(regex, sizeof(ngx_http_script_regex_code_t));            err.len = NGX_MAX_CONF_ERRSTR;            err.data = errstr;            regex->regex = ngx_regex_compile(&value[last],                                  (p[len - 1] == '*') ? NGX_REGEX_CASELESS : 0,                                   cf->pool, &err);            if (regex->regex == NULL) {                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%s", err.data);                return NGX_CONF_ERROR;            }            regex->code = ngx_http_script_regex_start_code;            regex->next = sizeof(ngx_http_script_regex_code_t);            regex->test = 1;            if (p[0] == '!') {                regex->negative_test = 1;            }            regex->name = value[last];            n = ngx_regex_capture_count(regex->regex);            if (n) {                regex->ncaptures = (n + 1) * 3;                if (lcf->captures < regex->ncaptures) {                    lcf->captures = regex->ncaptures;                }            }            return NGX_CONF_OK;        }        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,                           "unexpected \"%V\" in condition", &value[cur]);        return NGX_CONF_ERROR;    } else if ((len == 2 && p[0] == '-')               || (len == 3 && p[0] == '!' && p[1] == '-'))    {        if (cur + 1 != last) {            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,                               "invalid condition \"%V\"", &value[cur]);            return NGX_CONF_ERROR;        }        value[last].data[value[last].len] = '\0';        value[last].len++;        if (ngx_http_rewrite_value(cf, lcf, &value[last]) != NGX_CONF_OK) {            return NGX_CONF_ERROR;        }        fop = ngx_http_script_start_code(cf->pool, &lcf->codes,                                          sizeof(ngx_http_script_file_code_t));        if (fop == NULL) {            return NGX_CONF_ERROR;        }        fop->code = ngx_http_script_file_code;        if (p[1] == 'f') {            fop->op = ngx_http_script_file_plain;            return NGX_CONF_OK;        }        if (p[1] == 'd') {            fop->op = ngx_http_script_file_dir;            return NGX_CONF_OK;        }        if (p[1] == 'e') {            fop->op = ngx_http_script_file_exists;            return NGX_CONF_OK;        }        if (p[1] == 'x') {            fop->op = ngx_http_script_file_exec;            return NGX_CONF_OK;        }        if (p[0] == '!') {            if (p[2] == 'f') {                fop->op = ngx_http_script_file_not_plain;                return NGX_CONF_OK;            }            if (p[2] == 'd') {                fop->op = ngx_http_script_file_not_dir;                return NGX_CONF_OK;            }            if (p[2] == 'e') {                fop->op = ngx_http_script_file_not_exists;                return NGX_CONF_OK;            }            if (p[2] == 'x') {                fop->op = ngx_http_script_file_not_exec;                return NGX_CONF_OK;            }        }        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,                           "invalid condition \"%V\"", &value[cur]);        return NGX_CONF_ERROR;    }    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,                       "invalid condition \"%V\"", &value[cur]);    return NGX_CONF_ERROR;}static char *ngx_http_rewrite_variable(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf,    ngx_str_t *value){    ngx_int_t                    index;    ngx_http_script_var_code_t  *var_code;    value->len--;    value->data++;    index = ngx_http_get_variable_index(cf, value);    if (index == NGX_ERROR) {        return NGX_CONF_ERROR;    }    var_code = ngx_http_script_start_code(cf->pool, &lcf->codes,                                          sizeof(ngx_http_script_var_code_t));    if (var_code == NULL) {        return NGX_CONF_ERROR;    }    var_code->code = ngx_http_script_var_code;    var_code->index = index;    return NGX_CONF_OK;}static char *ngx_http_rewrite_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf){    ngx_http_rewrite_loc_conf_t  *lcf = conf;    ngx_int_t                            index;    ngx_str_t                           *value;    ngx_http_variable_t                 *v;    ngx_http_script_var_code_t          *vcode;    ngx_http_script_var_handler_code_t  *vhcode;    value = cf->args->elts;    if (value[1].data[0] != '$') {        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,                           "invalid variable name \"%V\"", &value[1]);        return NGX_CONF_ERROR;    }    value[1].len--;    value[1].data++;    v = ngx_http_add_variable(cf, &value[1], NGX_HTTP_VAR_CHANGEABLE);    if (v == NULL) {        return NGX_CONF_ERROR;    }    index = ngx_http_get_variable_index(cf, &value[1]);    if (index == NGX_ERROR) {        return NGX_CONF_ERROR;    }    if (v->get_handler == NULL        && ngx_strncasecmp(value[1].data, (u_char *) "http_", 5) != 0        && ngx_strncasecmp(value[1].data, (u_char *) "sent_http_", 10) != 0        && ngx_strncasecmp(value[1].data, (u_char *) "upstream_http_", 14) != 0)    {        v->get_handler = ngx_http_rewrite_var;        v->data = index;    }    if (ngx_http_rewrite_value(cf, lcf, &value[2]) != NGX_CONF_OK) {        return NGX_CONF_ERROR;    }    if (v->set_handler) {        vhcode = ngx_http_script_start_code(cf->pool, &lcf->codes,                                   sizeof(ngx_http_script_var_handler_code_t));        if (vhcode == NULL) {            return NGX_CONF_ERROR;        }        vhcode->code = ngx_http_script_var_set_handler_code;        vhcode->handler = v->set_handler;        vhcode->data = v->data;        return NGX_CONF_OK;    }    vcode = ngx_http_script_start_code(cf->pool, &lcf->codes,                                       sizeof(ngx_http_script_var_code_t));    if (vcode == NULL) {        return NGX_CONF_ERROR;    }    vcode->code = ngx_http_script_set_var_code;    vcode->index = (uintptr_t) index;    return NGX_CONF_OK;}static char *ngx_http_rewrite_value(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf,    ngx_str_t *value){    ngx_int_t                              n;    ngx_http_script_compile_t              sc;    ngx_http_script_value_code_t          *val;    ngx_http_script_complex_value_code_t  *complex;    n = ngx_http_script_variables_count(value);    if (n == 0) {        val = ngx_http_script_start_code(cf->pool, &lcf->codes,                                         sizeof(ngx_http_script_value_code_t));        if (val == NULL) {            return NGX_CONF_ERROR;        }        n = ngx_atoi(value->data, value->len);        if (n == NGX_ERROR) {            n = 0;        }        val->code = ngx_http_script_value_code;        val->value = (uintptr_t) n;        val->text_len = (uintptr_t) value->len;        val->text_data = (uintptr_t) value->data;        return NGX_CONF_OK;    }    complex = ngx_http_script_start_code(cf->pool, &lcf->codes,                                 sizeof(ngx_http_script_complex_value_code_t));    if (complex == NULL) {        return NGX_CONF_ERROR;    }    complex->code = ngx_http_script_complex_value_code;    complex->lengths = NULL;    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));    sc.cf = cf;    sc.source = value;    sc.lengths = &complex->lengths;    sc.values = &lcf->codes;    sc.variables = n;    sc.complete_lengths = 1;    if (ngx_http_script_compile(&sc) != NGX_OK) {        return NGX_CONF_ERROR;    }    return NGX_CONF_OK;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -