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

📄 ngx_http_variables.c

📁 Nginx是一个高性能的HTTP和反向代理服务器
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * Copyright (C) Igor Sysoev */#include <ngx_config.h>#include <ngx_core.h>#include <ngx_event.h>#include <ngx_http.h>#include <nginx.h>static ngx_int_t ngx_http_variable_request(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static void ngx_http_variable_request_set(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static void ngx_http_variable_request_set_size(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_header(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_headers(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_unknown_header_in(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_unknown_header_out(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_host(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_binary_remote_addr(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_remote_addr(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_remote_port(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_server_addr(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_server_port(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_scheme(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_is_args(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_document_root(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_request_filename(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_server_name(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_request_method(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_remote_user(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_body_bytes_sent(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_request_completion(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_request_body_file(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_sent_content_type(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_sent_content_length(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_sent_last_modified(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_sent_connection(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_sent_keep_alive(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_sent_transfer_encoding(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);static ngx_int_t ngx_http_variable_nginx_version(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data);/* * TODO: *     Apache CGI: AUTH_TYPE, PATH_INFO (null), PATH_TRANSLATED *                 REMOTE_HOST (null), REMOTE_IDENT (null), *                 SERVER_SOFTWARE * *     Apache SSI: DOCUMENT_NAME, LAST_MODIFIED, USER_NAME (file owner) *//* * the $http_host, $http_user_agent, $http_referer, $http_via, * and $http_x_forwarded_for variables may be handled by generic * ngx_http_variable_unknown_header_in(), but for perfomance reasons * they are handled using dedicated entries */static ngx_http_variable_t  ngx_http_core_variables[] = {    { ngx_string("http_host"), NULL, ngx_http_variable_header,      offsetof(ngx_http_request_t, headers_in.host), 0, 0 },    { ngx_string("http_user_agent"), NULL, ngx_http_variable_header,      offsetof(ngx_http_request_t, headers_in.user_agent), 0, 0 },    { ngx_string("http_referer"), NULL, ngx_http_variable_header,      offsetof(ngx_http_request_t, headers_in.referer), 0, 0 },#if (NGX_HTTP_GZIP)    { ngx_string("http_via"), NULL, ngx_http_variable_header,      offsetof(ngx_http_request_t, headers_in.via), 0, 0 },#endif#if (NGX_HTTP_PROXY || NGX_HTTP_REALIP)    { ngx_string("http_x_forwarded_for"), NULL, ngx_http_variable_header,      offsetof(ngx_http_request_t, headers_in.x_forwarded_for), 0, 0 },#endif    { ngx_string("http_cookie"), NULL, ngx_http_variable_headers,      offsetof(ngx_http_request_t, headers_in.cookies), 0, 0 },    { ngx_string("content_length"), NULL, ngx_http_variable_header,      offsetof(ngx_http_request_t, headers_in.content_length), 0, 0 },    { ngx_string("content_type"), NULL, ngx_http_variable_header,      offsetof(ngx_http_request_t, headers_in.content_type), 0, 0 },    { ngx_string("host"), NULL, ngx_http_variable_host, 0, 0, 0 },    { ngx_string("binary_remote_addr"), NULL,      ngx_http_variable_binary_remote_addr, 0, 0, 0 },    { ngx_string("remote_addr"), NULL, ngx_http_variable_remote_addr, 0, 0, 0 },    { ngx_string("remote_port"), NULL, ngx_http_variable_remote_port, 0, 0, 0 },    { ngx_string("server_addr"), NULL, ngx_http_variable_server_addr, 0, 0, 0 },    { ngx_string("server_port"), NULL, ngx_http_variable_server_port, 0, 0, 0 },    { ngx_string("server_protocol"), NULL, ngx_http_variable_request,      offsetof(ngx_http_request_t, http_protocol), 0, 0 },    { ngx_string("scheme"), NULL, ngx_http_variable_scheme, 0, 0, 0 },    { ngx_string("request_uri"), NULL, ngx_http_variable_request,      offsetof(ngx_http_request_t, unparsed_uri), 0, 0 },    { ngx_string("uri"), NULL, ngx_http_variable_request,      offsetof(ngx_http_request_t, uri),      NGX_HTTP_VAR_NOCACHEABLE, 0 },    { ngx_string("document_uri"), NULL, ngx_http_variable_request,      offsetof(ngx_http_request_t, uri),      NGX_HTTP_VAR_NOCACHEABLE, 0 },    { ngx_string("request"), NULL, ngx_http_variable_request,      offsetof(ngx_http_request_t, request_line), 0, 0 },    { ngx_string("document_root"), NULL,      ngx_http_variable_document_root, 0, NGX_HTTP_VAR_NOCACHEABLE, 0 },    { ngx_string("query_string"), NULL, ngx_http_variable_request,      offsetof(ngx_http_request_t, args),      NGX_HTTP_VAR_NOCACHEABLE, 0 },    { ngx_string("args"),      ngx_http_variable_request_set,      ngx_http_variable_request,      offsetof(ngx_http_request_t, args),      NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 },    { ngx_string("is_args"), NULL, ngx_http_variable_is_args,      0, NGX_HTTP_VAR_NOCACHEABLE, 0 },    { ngx_string("request_filename"), NULL,      ngx_http_variable_request_filename, 0,      NGX_HTTP_VAR_NOCACHEABLE, 0 },    { ngx_string("server_name"), NULL, ngx_http_variable_server_name, 0, 0, 0 },    { ngx_string("request_method"), NULL,      ngx_http_variable_request_method, 0, 0, 0 },    { ngx_string("remote_user"), NULL, ngx_http_variable_remote_user, 0, 0, 0 },    { ngx_string("body_bytes_sent"), NULL, ngx_http_variable_body_bytes_sent,      0, 0, 0 },    { ngx_string("request_completion"), NULL,      ngx_http_variable_request_completion,      0, 0, 0 },    { ngx_string("request_body_file"), NULL,      ngx_http_variable_request_body_file,      0, 0, 0 },    { ngx_string("sent_http_content_type"), NULL,      ngx_http_variable_sent_content_type, 0, 0, 0 },    { ngx_string("sent_http_content_length"), NULL,      ngx_http_variable_sent_content_length, 0, 0, 0 },    { ngx_string("sent_http_last_modified"), NULL,      ngx_http_variable_sent_last_modified, 0, 0, 0 },    { ngx_string("sent_http_connection"), NULL,      ngx_http_variable_sent_connection, 0, 0, 0 },    { ngx_string("sent_http_keep_alive"), NULL,      ngx_http_variable_sent_keep_alive, 0, 0, 0 },    { ngx_string("sent_http_transfer_encoding"), NULL,      ngx_http_variable_sent_transfer_encoding, 0, 0, 0 },    { ngx_string("sent_http_cache_control"), NULL, ngx_http_variable_headers,      offsetof(ngx_http_request_t, headers_out.cache_control), 0, 0 },    { ngx_string("limit_rate"), ngx_http_variable_request_set_size,      ngx_http_variable_request,      offsetof(ngx_http_request_t, limit_rate),      NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 },    { ngx_string("nginx_version"), NULL, ngx_http_variable_nginx_version,      0, 0, 0 },    { ngx_null_string, NULL, NULL, 0, 0, 0 }};ngx_http_variable_value_t  ngx_http_variable_null_value =    ngx_http_variable("");ngx_http_variable_value_t  ngx_http_variable_true_value =    ngx_http_variable("1");ngx_http_variable_t *ngx_http_add_variable(ngx_conf_t *cf, ngx_str_t *name, ngx_uint_t flags){    ngx_int_t                   rc;    ngx_uint_t                  i;    ngx_hash_key_t             *key;    ngx_http_variable_t        *v;    ngx_http_core_main_conf_t  *cmcf;    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);    key = cmcf->variables_keys->keys.elts;    for (i = 0; i < cmcf->variables_keys->keys.nelts; i++) {        if (name->len != key[i].key.len            || ngx_strncasecmp(name->data, key[i].key.data, name->len) != 0)        {            continue;        }        v = key[i].value;        if (!(v->flags & NGX_HTTP_VAR_CHANGEABLE)) {            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,                               "the duplicate \"%V\" variable", name);            return NULL;        }        return v;    }    v = ngx_palloc(cf->pool, sizeof(ngx_http_variable_t));    if (v == NULL) {        return NULL;    }    v->name.len = name->len;    v->name.data = ngx_palloc(cf->pool, name->len);    if (v->name.data == NULL) {        return NULL;    }    for (i = 0; i < name->len; i++) {        v->name.data[i] = ngx_tolower(name->data[i]);    }    v->set_handler = NULL;    v->get_handler = NULL;    v->data = 0;    v->flags = flags;    v->index = 0;    rc = ngx_hash_add_key(cmcf->variables_keys, &v->name, v, 0);    if (rc == NGX_ERROR) {        return NULL;    }    if (rc == NGX_BUSY) {        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,                           "conflicting variable name \"%V\"", name);        return NULL;    }    return v;}ngx_int_tngx_http_get_variable_index(ngx_conf_t *cf, ngx_str_t *name){    ngx_uint_t                  i;    ngx_http_variable_t        *v;    ngx_http_core_main_conf_t  *cmcf;    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);    v = cmcf->variables.elts;    if (v == NULL) {        if (ngx_array_init(&cmcf->variables, cf->pool, 4,                           sizeof(ngx_http_variable_t)) == NGX_ERROR)        {            return NGX_ERROR;        }    } else {        for (i = 0; i < cmcf->variables.nelts; i++) {            if (name->len != v[i].name.len                || ngx_strncasecmp(name->data, v[i].name.data, name->len) != 0)            {                continue;            }            return i;        }    }    v = ngx_array_push(&cmcf->variables);    if (v == NULL) {        return NGX_ERROR;    }    v->name.len = name->len;    v->name.data = ngx_palloc(cf->pool, name->len);    if (v->name.data == NULL) {        return NGX_ERROR;    }    for (i = 0; i < name->len; i++) {        v->name.data[i] = ngx_tolower(name->data[i]);    }    v->set_handler = NULL;    v->get_handler = NULL;    v->data = 0;    v->flags = 0;    v->index = cmcf->variables.nelts - 1;    return cmcf->variables.nelts - 1;}ngx_http_variable_value_t *ngx_http_get_indexed_variable(ngx_http_request_t *r, ngx_uint_t index){    ngx_http_variable_t        *v;    ngx_http_core_main_conf_t  *cmcf;    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);    if (cmcf->variables.nelts <= index) {        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,                      "unknown variable index: %d", index);        return NULL;    }    if (r->variables[index].not_found || r->variables[index].valid) {        return &r->variables[index];    }    v = cmcf->variables.elts;    if (v[index].get_handler(r, &r->variables[index], v[index].data)        == NGX_OK)    {        if (v[index].flags & NGX_HTTP_VAR_NOCACHEABLE) {            r->variables[index].no_cacheable = 1;        }        return &r->variables[index];    }    r->variables[index].valid = 0;    r->variables[index].not_found = 1;    return NULL;}ngx_http_variable_value_t *ngx_http_get_flushed_variable(ngx_http_request_t *r, ngx_uint_t index){    ngx_http_variable_value_t  *v;    v = &r->variables[index];    if (v->valid) {        if (!v->no_cacheable) {            return v;        }        v->valid = 0;        v->not_found = 0;    }    return ngx_http_get_indexed_variable(r, index);}ngx_http_variable_value_t *ngx_http_get_variable(ngx_http_request_t *r, ngx_str_t *name, ngx_uint_t key,    ngx_uint_t nowarn){    ngx_http_variable_t        *v;    ngx_http_variable_value_t  *vv;    ngx_http_core_main_conf_t  *cmcf;    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);    v = ngx_hash_find(&cmcf->variables_hash, key, name->data, name->len);    if (v) {        if (v->flags & NGX_HTTP_VAR_INDEXED) {            return ngx_http_get_indexed_variable(r, v->index);        } else {            vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t));            if (vv && v->get_handler(r, vv, v->data) == NGX_OK) {                return vv;            }            return NULL;        }    }    vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t));    if (vv == NULL) {        return NULL;    }    if (ngx_strncmp(name->data, "http_", 5) == 0) {        if (ngx_http_variable_unknown_header_in(r, vv, (uintptr_t) name)            == NGX_OK)        {            return vv;        }        return NULL;    }    if (ngx_strncmp(name->data, "sent_http_", 10) == 0) {        if (ngx_http_variable_unknown_header_out(r, vv, (uintptr_t) name)            == NGX_OK)        {            return vv;        }        return NULL;    }    if (ngx_strncmp(name->data, "upstream_http_", 10) == 0) {        if (ngx_http_upstream_header_variable(r, vv, (uintptr_t) name)            == NGX_OK)        {            return vv;        }        return NULL;    }

⌨️ 快捷键说明

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