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

📄 mod_rewrite.c

📁 Apache官方在今天放出产品系列2.2的最新版本2.2.11的源码包 最流行的HTTP服务器软件之一
💻 C
📖 第 1 页 / 共 5 页
字号:
                    ctx->r = r;                    ap_destroy_sub_req(rr);                    rewritelog((r, 5, ctx->perdir, "lookahead: path=%s var=%s "                                "-> val=%s", path, var+5, result));                    return (char *)result;                }            }        }    }    /* well, do it the hard way */    else {        char *p;        apr_time_exp_t tm;        /* can't do this above, because of the getenv call */        for (p = var; *p; ++p) {            *p = apr_toupper(*p);        }        switch (varlen) {        case  4:            if (!strcmp(var, "TIME")) {                apr_time_exp_lt(&tm, apr_time_now());                result = apr_psprintf(r->pool, "%04d%02d%02d%02d%02d%02d",                                      tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday,                                      tm.tm_hour, tm.tm_min, tm.tm_sec);                rewritelog((r, 1, ctx->perdir, "RESULT='%s'", result));                return (char *)result;            }            break;        case  5:            if (!strcmp(var, "HTTPS")) {                int flag = rewrite_is_https && rewrite_is_https(r->connection);                return apr_pstrdup(r->pool, flag ? "on" : "off");            }            break;        case  8:            switch (var[6]) {            case 'A':                if (!strcmp(var, "TIME_DAY")) {                    apr_time_exp_lt(&tm, apr_time_now());                    return apr_psprintf(r->pool, "%02d", tm.tm_mday);                }                break;            case 'E':                if (!strcmp(var, "TIME_SEC")) {                    apr_time_exp_lt(&tm, apr_time_now());                    return apr_psprintf(r->pool, "%02d", tm.tm_sec);                }                break;            case 'I':                if (!strcmp(var, "TIME_MIN")) {                    apr_time_exp_lt(&tm, apr_time_now());                    return apr_psprintf(r->pool, "%02d", tm.tm_min);                }                break;            case 'O':                if (!strcmp(var, "TIME_MON")) {                    apr_time_exp_lt(&tm, apr_time_now());                    return apr_psprintf(r->pool, "%02d", tm.tm_mon+1);                }                break;            }            break;        case  9:            switch (var[7]) {            case 'A':                if (var[8] == 'Y' && !strcmp(var, "TIME_WDAY")) {                    apr_time_exp_lt(&tm, apr_time_now());                    return apr_psprintf(r->pool, "%d", tm.tm_wday);                }                else if (!strcmp(var, "TIME_YEAR")) {                    apr_time_exp_lt(&tm, apr_time_now());                    return apr_psprintf(r->pool, "%04d", tm.tm_year+1900);                }                break;            case 'E':                if (!strcmp(var, "IS_SUBREQ")) {                    result = (r->main ? "true" : "false");                }                break;            case 'F':                if (!strcmp(var, "PATH_INFO")) {                    result = r->path_info;                }                break;            case 'P':                if (!strcmp(var, "AUTH_TYPE")) {                    result = r->ap_auth_type;                }                break;            case 'S':                if (!strcmp(var, "HTTP_HOST")) {                    result = lookup_header("Host", ctx);                }                break;            case 'U':                if (!strcmp(var, "TIME_HOUR")) {                    apr_time_exp_lt(&tm, apr_time_now());                    return apr_psprintf(r->pool, "%02d", tm.tm_hour);                }                break;            }            break;        case 11:            switch (var[8]) {            case 'A':                if (!strcmp(var, "SERVER_NAME")) {                    result = ap_get_server_name(r);                }                break;            case 'D':                if (*var == 'R' && !strcmp(var, "REMOTE_ADDR")) {                    result = r->connection->remote_ip;                }                else if (!strcmp(var, "SERVER_ADDR")) {                    result = r->connection->local_ip;                }                break;            case 'E':                if (*var == 'H' && !strcmp(var, "HTTP_ACCEPT")) {                    result = lookup_header("Accept", ctx);                }                else if (!strcmp(var, "THE_REQUEST")) {                    result = r->the_request;                }                break;            case 'I':                if (!strcmp(var, "API_VERSION")) {                    return apr_psprintf(r->pool, "%d:%d",                                        MODULE_MAGIC_NUMBER_MAJOR,                                        MODULE_MAGIC_NUMBER_MINOR);                }                break;            case 'K':                if (!strcmp(var, "HTTP_COOKIE")) {                    result = lookup_header("Cookie", ctx);                }                break;            case 'O':                if (*var == 'S' && !strcmp(var, "SERVER_PORT")) {                    return apr_psprintf(r->pool, "%u", ap_get_server_port(r));                }                else if (var[7] == 'H' && !strcmp(var, "REMOTE_HOST")) {                    result = ap_get_remote_host(r->connection,r->per_dir_config,                                                REMOTE_NAME, NULL);                }                else if (!strcmp(var, "REMOTE_PORT")) {                    return apr_itoa(r->pool, r->connection->remote_addr->port);                }                break;            case 'S':                if (*var == 'R' && !strcmp(var, "REMOTE_USER")) {                    result = r->user;                }                else if (!strcmp(var, "SCRIPT_USER")) {                    result = "<unknown>";                    if (r->finfo.valid & APR_FINFO_USER) {                        apr_uid_name_get((char **)&result, r->finfo.user,                                         r->pool);                    }                }                break;            case 'U':                if (!strcmp(var, "REQUEST_URI")) {                    result = r->uri;                }                break;            }            break;        case 12:            switch (var[3]) {            case 'I':                if (!strcmp(var, "SCRIPT_GROUP")) {                    result = "<unknown>";                    if (r->finfo.valid & APR_FINFO_GROUP) {                        apr_gid_name_get((char **)&result, r->finfo.group,                                         r->pool);                    }                }                break;            case 'O':                if (!strcmp(var, "REMOTE_IDENT")) {                    result = ap_get_remote_logname(r);                }                break;            case 'P':                if (!strcmp(var, "HTTP_REFERER")) {                    result = lookup_header("Referer", ctx);                }                break;            case 'R':                if (!strcmp(var, "QUERY_STRING")) {                    result = r->args;                }                break;            case 'V':                if (!strcmp(var, "SERVER_ADMIN")) {                    result = r->server->server_admin;                }                break;            }            break;        case 13:            if (!strcmp(var, "DOCUMENT_ROOT")) {                result = ap_document_root(r);            }            break;        case 14:            if (*var == 'H' && !strcmp(var, "HTTP_FORWARDED")) {                result = lookup_header("Forwarded", ctx);            }            else if (!strcmp(var, "REQUEST_METHOD")) {                result = r->method;            }            break;        case 15:            switch (var[7]) {            case 'E':                if (!strcmp(var, "HTTP_USER_AGENT")) {                    result = lookup_header("User-Agent", ctx);                }                break;            case 'F':                if (!strcmp(var, "SCRIPT_FILENAME")) {                    result = r->filename; /* same as request_filename (16) */                }                break;            case 'P':                if (!strcmp(var, "SERVER_PROTOCOL")) {                    result = r->protocol;                }                break;            case 'S':                if (!strcmp(var, "SERVER_SOFTWARE")) {                    result = ap_get_server_banner();                }                break;            }            break;        case 16:            if (!strcmp(var, "REQUEST_FILENAME")) {                result = r->filename; /* same as script_filename (15) */            }            break;        case 21:            if (!strcmp(var, "HTTP_PROXY_CONNECTION")) {                result = lookup_header("Proxy-Connection", ctx);            }            break;        }    }    return apr_pstrdup(r->pool, result ? result : "");}/* * +-------------------------------------------------------+ * |                                                       | * |                 Expansion functions * |                                                       | * +-------------------------------------------------------+ *//* * Bracketed expression handling * s points after the opening bracket */static APR_INLINE char *find_closing_curly(char *s){    unsigned depth;    for (depth = 1; *s; ++s) {        if (*s == RIGHT_CURLY && --depth == 0) {            return s;        }        else if (*s == LEFT_CURLY) {            ++depth;        }    }    return NULL;}static APR_INLINE char *find_char_in_curlies(char *s, int c){    unsigned depth;    for (depth = 1; *s; ++s) {        if (*s == c && depth == 1) {            return s;        }        else if (*s == RIGHT_CURLY && --depth == 0) {            return NULL;        }        else if (*s == LEFT_CURLY) {            ++depth;        }    }    return NULL;}/* perform all the expansions on the input string * putting the result into a new string * * for security reasons this expansion must be performed in a * single pass, otherwise an attacker can arrange for the result * of an earlier expansion to include expansion specifiers that * are interpreted by a later expansion, producing results that * were not intended by the administrator. */static char *do_expand(char *input, rewrite_ctx *ctx, rewriterule_entry *entry){    result_list *result, *current;    result_list sresult[SMALL_EXPANSION];    unsigned spc = 0;    apr_size_t span, inputlen, outlen;    char *p, *c;    apr_pool_t *pool = ctx->r->pool;    span = strcspn(input, "\\$%");    inputlen = strlen(input);    /* fast exit */    if (inputlen == span) {        return apr_pstrdup(pool, input);    }    /* well, actually something to do */    result = current = &(sresult[spc++]);    p = input + span;    current->next = NULL;    current->string = input;    current->len = span;    outlen = span;    /* loop for specials */    do {        /* prepare next entry */        if (current->len) {            current->next = (spc < SMALL_EXPANSION)                            ? &(sresult[spc++])                            : (result_list *)apr_palloc(pool,                                                        sizeof(result_list));            current = current->next;            current->next = NULL;            current->len = 0;        }        /* escaped character */        if (*p == '\\') {            current->len = 1;            ++outlen;            if (!p[1]) {                current->string = p;                break;            }            else {                current->string = ++p;                ++p;            }        }        /* variable or map lookup */        else if (p[1] == '{') {            char *endp;            endp = find_closing_curly(p+2);            if (!endp) {                current->len = 2;                current->string = p;                outlen += 2;                p += 2;            }            /* variable lookup */            else if (*p == '%') {                p = lookup_variable(apr_pstrmemdup(pool, p+2, endp-p-2), ctx);                span = strlen(p);                current->len = span;                current->string = p;                outlen += span;                p = endp + 1;            }            /* map lookup */            else {     /* *p == '$' */                char *key;                /*                 * To make rewrite maps useful, the lookup key and                 * default values must be expanded, so we make                 * recursive calls to do the work. For security                 * reasons we must never expand a string that includes                 * verbatim da

⌨️ 快捷键说明

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